0

このクエリは、サブジェクトごとにグループ化された目的の行を取得します。また、各グループのアイテム数も知りたいです。

SELECT log.* FROM [hm_deliverylog] AS log
WHERE log.deliveryid IN
    (
        SELECT MAX([deliveryid])  FROM [hm_deliverylog]
        WHERE [deliverytime] > DATEADD(HOUR, -12, GETDATE())
        GROUP BY deliverysubject
    )

ORDER BY deliveryid DESC

グループを数えるにはどうすればよいですか?以下のように?

SELECT joined.groupcount, log.* FROM [hm_deliverylog] AS log

PS: Gmail の受信トレイを想像してみてください。最新のメッセージが表示され、メッセージ数が表示されます。同じ件名のメッセージをグループ化してカウントしたい...

4

3 に答える 3

1

1つの方法は、COUNT()計算をサブクエリに入れ、を使用する代わりにIN、派生テーブルを結合するようにすることです。

SELECT log.* 
     , grp.cnt AS groupcount
FROM 
    [hm_deliverylog] AS log
  JOIN 
    (
        SELECT MAX([deliveryid]) AS deliveryid
             , COUNT(*) AS cnt  
        FROM [hm_deliverylog]
        WHERE [deliverytime] > DATEADD(HOUR, -12, GETDATE())
        GROUP BY deliverysubject
    ) AS grp
    ON grp.deliveryid = log.deliveryid
ORDER BY 
    log.deliveryid DESC ;
于 2012-11-08T12:02:24.347 に答える
1

OVERを使用できます:

SELECT COUNT(deliveryid) OVER (PARTITION BY deliverysubject) As GroupCount

関連するウィンドウ関数が適用される前に、行セットの分割と順序付けを決定します。つまり、OVER 句は、クエリ結果セット内のウィンドウまたはユーザー指定の行セットを定義します。ウィンドウ関数は、ウィンドウ内の各行の値を計算します。関数で OVER 句を使用して、移動平均、累積集計、累計、グループ結果ごとの上位 N などの集計値を計算できます。

于 2012-11-08T11:53:23.933 に答える
0
SELECT log.*, COUNT(*) OVER (PARTITION BY deliverysubject) AS groupcount 
FROM [hm_deliverylog] AS log
GROUP BY deliverysubject
于 2012-11-08T11:59:45.213 に答える