2017-10-30 5 views
0

各グループ、ユーザー、ステータス、特定のフィールドの最大値を1日に表示する必要があるクエリに問題があります。各グループの最大値のみ表示する

groupno user status      date amount 
     74 user1 status_1 2016-01-01 05:40:00.0 900 
     74 user1 status_1 2016-01-01 05:45:00.0 1200 
     79 user1 status_2 2016-01-01 05:45:31.0 31 
     79 user1 status_2 2016-01-01 05:50:00.0 300 
     79 user1 status_2 2016-01-01 05:55:00.0 600 
     79 user1 status_2 2016-01-01 06:00:00.0 900 
     79 user1 status_2 2016-01-01 06:05:00.0 1200 
     90 user1 status_1 2016-01-01 06:07:52.0 172 
     90 user1 status_1 2016-01-01 06:10:00.0 300 
     90 user1 status_1 2016-01-01 06:15:00.0 600 

私はインナーを使用しようとしているが、グループごとに最大に最大量に参加するが、私は再びすべての値を取得するように動作していない:

select t.groupno, t.user, t.status, t.date, t.amount 
from (select groupno,user, status, date, max (amount) as maxact from table group by 1,2,3,4) as m 
Inner 
join table as t 
on t.user= m.user 
and t.amount= m.maxact 
and t.status = m.status 
and t.date = m.date 
+2

希望の結果を投稿してください。あなたが 'row_number()'関数を必要としているように見えますが、検証可能な結果が表示されない限り、私は確信が持てません – Simon

+0

入力があれば、どんな出力が見えますか? –

答えて

0

あなただけタのデータに対する最大量を、したい場合は、MAXを取り、日付と日時をキャストすることができます:私は完全に質問に従うならば

DECLARE @temp TABLE (groupno int, [user] varchar(20), status varchar(20), date datetime, amount int) 

INSERT INTO @temp 
VALUES 
(74,'user1', 'status_1', '2016-01-01 05:40:00.0', 900) 
,(74,'user1', 'status_1', '2016-01-01 05:45:00.0', 1200) 
,(79,'user1', 'status_2', '2016-01-01 05:45:31.0', 31) 
,(79,'user1', 'status_2', '2016-01-01 05:50:00.0', 300) 
,(79,'user1', 'status_2', '2016-01-01 05:55:00.0', 600) 
,(79,'user1', 'status_2', '2016-01-01 06:00:00.0', 900) 
,(79,'user1', 'status_2', '2016-01-01 06:05:00.0', 1200) 
,(90,'user1', 'status_1', '2016-01-01 06:07:52.0', 172) 
,(90,'user1', 'status_1', '2016-01-01 06:10:00.0', 300) 
,(90,'user1', 'status_1', '2016-01-01 06:15:00.0', 600) 


SELECT groupno, [user], [status], CAST([date] as date) [Date], MAX(amount) as MAXamount 
FROM @temp 
GROUP BY groupno, [user], [status], CAST([date] as date) 
+0

赤いシフトコードではありません –

1

使用ウィンドウ機能:

select t.*, 
     max(t.amount) over (partition by groupno, user, status, date_trunc('day', date)) as max_amount 
from t; 

最大値を計算するための寸法は、groupno/user/status /日と仮定します。

0

わからないが、私には見えますあなたが各グループの最大金額で行をしたいように。それで、あなたは試してみることができます:

SELECT t.groupno, t.user, t.status, t.date, t.amount 
FROM t 
INNER JOIN 
(SELECT groupno, MAX(amount) as mx 
FROM t 
GROUP BY groupno) sub 
ON t.groupno = sub.groupno 
WHERE t.amount = sub.mx