0

次のようなデータを含むテーブルがあります。

date          met       val

2012-10-18    avgt    63.3617
2012-10-16    avgt    65.7312
2012-10-19    avgt    66.4952
2012-10-17    avgt    67.3747
2012-10-18    cdd     53.3617
2012-10-17    cdd     55.3472
2012-10-19    cdd     66.8063
2012-10-16    cdd     67.3116
2012-10-18    maxt    43.3617
2012-10-19    maxt    47.4484
2012-10-16    maxt    65.9559
2012-10-17    maxt    66.2868
2012-10-19    mint    56.0447
2012-10-16    mint    65.0656
2012-10-18    mint    65.0656
2012-10-17    mint    66.4952

met列には、 val列のデータにラベルを付ける 4 つの可能な値 (avgt、mint、maxt、cdd、hdd) しかありません。次のようにデータを再配置するクエリ (おそらくストアド プロシージャ) が必要です。

 date           avgt        cdd         maxt        mint
 2012-10-16     65.7312     67.3116     65.9559     65.0656 
 2012-10-17     67.3747     55.3472     66.2868     66.4952 
 2012-10-18     63.3617     53.3617     43.3617     65.0656 
 2012-10-19     56.0447     66.8063     47.4484     56.0447 

これを静的な方法で行うのは簡単です。しかし、列の値が実際に何であるかに関係なく、再配置が適切metに行われるように、これを動的に実行したいと考えています。

これを手動で行う方法は次のとおりです。

追加の列を追加します。
ALTER TABLE MYTABLE  
ADD COLUMN  avgt FLOAT( 15, 5 ) NOT NULL AFTER  val , 
ADD COLUMN  mint FLOAT( 15, 5 ) NOT NULL AFTER  avgt , 
ADD COLUMN  maxt FLOAT( 15, 5 ) NOT NULL AFTER  mint , 
ADD COLUMN  cdd  FLOAT( 15, 5 ) NOT NULL AFTER  hdd
各行で新しい列を更新します。
UPDATE MYTABLE
SET avgt = val WHERE metric == 'avgt';
SET mint = val WHERE metric == 'mint';
SET maxt = val WHERE metric == 'maxt';
SET cdd  = val WHERE metric == 'cdd';
古い列を削除する
ALTER TABLE MYTABLE
DROP COLUMN met,
DROP COLUMN val;
met一意の値 のリストを取得する方法も理解しています:
SELECT DISTINCT met FROM MYTABLE

その間のロジックに欠けているもの。個別の値を反復処理する必要があります。誰かがそれで私を助けることができれば、私はそれを大いに感謝します.

純粋な SQL (おそらくストアド プロシージャ) または Python で記述された回答を受け入れます。

ありがとうございます!

4

1 に答える 1

1

満たされた列の値に依存しない柔軟なソリューションが必要なため、データベースからデータを取得した後、pythonで実行するのが最善の方法です。

data_str = """2012-10-18    avgt    63.3617
2012-10-16    avgt    65.7312
2012-10-19    avgt    66.4952
2012-10-17    avgt    67.3747
2012-10-18    cdd     53.3617
2012-10-17    cdd     55.3472
2012-10-19    cdd     66.8063
2012-10-16    cdd     67.3116
2012-10-18    maxt    43.3617
2012-10-19    maxt    47.4484
2012-10-16    maxt    65.9559
2012-10-17    maxt    66.2868
2012-10-19    mint    56.0447
2012-10-16    mint    65.0656
2012-10-18    mint    65.0656
2012-10-17    mint    66.4952"""

data = []
# convert to array data as it would be from sql
for line in data_str.split("\n"):
    row = line.split()
    data.append(row)

# ######## this is the code required to process sql output
import collections
date_map = collections.defaultdict(dict)
for date, met, val in data:
    date_map[date][met] = val

rows = []
for date, data in date_map.iteritems():
    row = [date]
    rows.append(row)
    values = data.items()
    values.sort()
    row.extend((v for met, v in values))
    print row

出力:

['2012-10-19', '66.4952', '66.8063', '47.4484', '56.0447']
['2012-10-18', '63.3617', '53.3617', '43.3617', '65.0656']
['2012-10-17', '67.3747', '55.3472', '66.2868', '66.4952']
['2012-10-16', '65.7312', '67.3116', '65.9559', '65.0656']
于 2012-10-25T20:51:20.230 に答える