2017-05-03 10 views
1

集計関数を使用してGROUP BYを使用してテーブルを集計しています(複数の外部キー、値列、およびタイムスタンプ列を丸めて丸めてグループ化) 。GROUP BYの集計値の代わりに最初の値を取得

しかし、集計値ではなく、グループ化の最初の行を取得する必要がある列があります。私はFIRST_VALUE()を見てきましたが、ウィンドウ関数であり集計関数ではありません。

私はこれを行うために探していた擬似コードで

[FIRST()関数が存在しません]:

SELECT 
    ForeignKey1 
    ,ForeignKey2 
    ,MIN(StartTime) AS StartTime 
    ,Foo 
    ,AVG(Bar) AS Bar 
    ,FIRST(Baz) AS Baz 
FROM 
    Qux 
GROUP BY 
    ForeignKey1 
    ,ForeignKey2 
    ,Foo 
    ,CONVERT(DATE, StartTime) 

をどのように私の代わりに集計値の最初の値を得るのですか?

+1

*最初に*を定義します。あなたは*発注することができる*基準*を私たちに与えていません。注文がなければ、最初はありません。 –

+0

"グループの最初の行"を実際に何を意味するのか(RDBMSには注文の概念がないので)?最小値(MIN)、最大値(MAX)、またはこれが別の列(例:行番号、またはCLUSTERED INDEXに基づいていますか? –

+0

@Damien_The_Unbeliever by 'first'、私は、各グループの行の早いStartTimeと一致するBazの値を意味します。 – mtmacdonald

答えて

1

あなたはCTEに行番号を適用し、全体の最初の行、別のMIN集約の必要はありません引き出すことができます。

;With Ordered as (
    SELECT 
     *, 
     ROW_NUMBER() OVER(
      PARTITION BY 
      ForeignKey1 
      ,ForeignKey2 
      ,Foo 
      ,CONVERT(DATE, StartTime) 
      ORDER BY StartTime) as rn, 
     AVG(Bar) OVER (
      PARTITION BY 
      ForeignKey1 
      ,ForeignKey2 
      ,Foo 
      ,CONVERT(DATE, StartTime)) as BarAvg 
    FROM Qux 
) 
SELECT * from Ordered 
WHERE rn = 1 
関連する問題