0

次のフィールドを持つテーブルがあります。

-location
-metername
-measurement
-measuredate

metername 列の各値が独自の列になるように、これを PIVOT にクエリを作成しました。ただし、測定フィールドに基づいて最新の検針値のみを表示するように制限したいと思います。助言がありますか?

SELECT LOCATION, MEASUREDATE, 
    [HEIGHT], [DIAM], [HEIGHT-N], 
    [HEIGHT-W], [HEIGHT-C], [HEIGHT-E], 
    [HEIGHT-S], [DIAM-N], [DIAM-W], 
    [DIAM-C], [DIAM-E], [DIAM-S] 
FROM 
( 
    SELECT LOCATION, MEASUREDATE, METERNAME, MEASUREMENTVALUE 
    FROM MEASUREMENT
) P 
PIVOT 
( 
    SUM(MEASUREMENTVALUE) 
    FOR METERNAME IN ([HEIGHT], [DIAM], [HEIGHT-N], [HEIGHT-W], [HEIGHT-C], 
                        [HEIGHT-E], [HEIGHT-S], [DIAM-N], [DIAM-W], [DIAM-C], 
                        [DIAM-E], [DIAM-S]) 
) AS PVT 
ORDER BY MEASUREDATE DESC
4

1 に答える 1

0

私の提案はrow_number()、サブクエリへの追加を検討することです。と でデータを分割するlocationorder by measuredate desc、場所ごとに一意の番号が生成され、その値でデータをフィルタリングできます。

SELECT LOCATION, MEASUREDATE, 
    [HEIGHT], [DIAM], [HEIGHT-N], 
    [HEIGHT-W], [HEIGHT-C], [HEIGHT-E], 
    [HEIGHT-S], [DIAM-N], [DIAM-W], 
    [DIAM-C], [DIAM-E], [DIAM-S] 
FROM 
( 
    SELECT LOCATION, MEASUREDATE, METERNAME, MEASUREMENTVALUE ,
      row_number() over(partition by location
                        order by measuredate desc) seq
    FROM MEASUREMENT
) P 
PIVOT 
( 
    SUM(MEASUREMENTVALUE) 
    FOR METERNAME IN ([HEIGHT], [DIAM], [HEIGHT-N], [HEIGHT-W], [HEIGHT-C], 
                        [HEIGHT-E], [HEIGHT-S], [DIAM-N], [DIAM-W], [DIAM-C], 
                        [DIAM-E], [DIAM-S]) 
) AS PVT 
where seq = 1;

デモで SQL Fiddle を参照してください

于 2013-10-29T21:01:00.473 に答える