2017-08-08 5 views
2

テーブルはFreq0Freq1イベントIDの発生を示し、次のSQLで文字列をシフトする方法は?

ID | Freq0 |  Freq1 | is_overnight | start_time | end_time | 
--------------------------------------------------------------------------- 
1 | _23_5_7 | _2____7 |  Y  | 1:00 | 3:00 | 
2 | 1_____7 | 1______ |  N  | 5:00 | 7:00 | 
3 | _2__5__ | _2_____ |  N  | 23:00 | 1:00 | 

のように見えると仮定します。たとえば、Freq0 = 1_____7は、イベントが月曜日と日曜日に発生することを意味します。また、Freq0Freq1はともにvarchar(7)です。 is_overnight = Y or start_time > end_time場合

修正ロジックがあり、Freq0Freq1両方がそうでない変化がない、右にシフトする必要があります。

右シフトの例は、上記の表に、このロジックを適用

_23_5_7 => 1_34_6_ 
1_____7 => 12_____ 
_2__5__ => __3__6_ 

あり、我々は次のような結果

ID | Freq0 |  Freq1 | is_overnight | start_time | end_time | 
--------------------------------------------------------------------------- 
1 | 1_34_6_ | 1_3____ |  Y  | 1:00 | 3:00 | 
2 | 1_____7 | 1______ |  N  | 5:00 | 7:00 | 
3 | __3__6_ | __3____ |  N  | 23:00 | 1:00 | 

を得ることになっている私が通りPythonを使用してこのタスクを完了することができました次のとおりです。

def right_shift(column_name): 
    def helper(raw_data): 
     content = raw_data[column_name] 
     if raw_data['is_overnight '] == 'Y' or raw_data['start_time '] > raw_data['end_time ']: 
      content = content[-1] + content[:-1] 
      content = [str(index + 1) if content[index] != '_' else '_' for index in range(len(content))] 
      return "".join(content) 
     else: 
      return content 
    return helper 

raw_data = pd.read_sql(sql_query, connection) 
raw_data['Freq0'] = raw_data.apply(right_shift('Freq0'), axis = 1) 
raw_data['Freq1'] = raw_data.apply(right_shift('Freq1'), axis = 1) 

しかし、 eこれはsqlで、これは私が困難なエレガントなコードの部分にそれを書くことに遭遇したときです。誰も私にここで手を差し伸べることはできますか?

+1

を動作するようです。これらの周波数を別の表で正規化する。 –

+0

@TT。詳細を教えてください。個人的には、ここでは正規化が問題だとは思わない。 –

+0

新しくフォーマットされた文字列を返す関数を書くべきでしょう。文字の上に単純なループで簡単に行う必要があります。 – SQLAndOtherStuffGuy

答えて

0

一つの選択肢ではなく、エレガントな、しかし、頻度情報を格納するために間違った方法である

Declare @YourTable table (Freq0 varchar(7)) 
Insert Into @YourTable values 
('_23_5_7') -- => 1_34_6_ 
,('1_____7') -- => 12_____ 
,('_2__5__') -- => __3__6_ 

Select * 
     ,NewVal = concat(IIF(Substring(Freq0,7,1)='_','_','1') 
         ,IIF(Substring(Freq0,1,1)='_','_','2') 
         ,IIF(Substring(Freq0,2,1)='_','_','3') 
         ,IIF(Substring(Freq0,3,1)='_','_','4') 
         ,IIF(Substring(Freq0,4,1)='_','_','5') 
         ,IIF(Substring(Freq0,5,1)='_','_','6') 
         ,IIF(Substring(Freq0,6,1)='_','_','7') 
        ) 

From @YourTable A 

戻り

Freq0  NewVal 
_23_5_7 1_34_6_ 
1_____7 12_____ 
_2__5__ __3__6_ 
+0

それは完璧ではありませんが、少なくとももっときれいにしてから7つの 'replace'sと' when'sです。 –