2017-10-30 4 views
0

각 그룹, 사용자, 상태, 특정 필드의 최대 값을 하루 동안 표시해야하는 쿼리에 문제가 있습니다. 나는 내부를 사용하기 위해 노력하고있어각 그룹의 최대 값 만 표시

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