2009-07-23 5 views
9

this question과 비슷하게 많은 수의 레코드를 1 시간짜리 버킷으로 그룹화해야합니다. 예를 들어, 각 주문에 날짜 시간이 첨부 된 일반적인 ORDER 테이블이 있다고 가정 해 봅시다. 그리고 시간당 총 주문 수를보고 싶습니다. 그래서 다음과 같이 대략 SQL을 사용하고 있습니다 :SQL 결과를 1 시간 버킷으로 그룹화/집계

SELECT datepart(hh, order_date), SUM(order_id) 
FROM ORDERS 
GROUP BY datepart(hh, order_date) 

문제는 어떤 주문이 ​​주어진 1 시간 "버킷"에 존재하지 않는 경우, 어떤 행이 결과 세트로 방출되지 않는 것입니다. 결과 세트에 24 시간마다 행이 표시되도록하고 싶습니다. 그러나 특정 시간에 주문이 없으면 주문 번호를 O로 기록하십시오.

단일 쿼리?

도 참조하십시오. Getting Hourly Statistics Using SQL

+0

사용중인 Pg의 버전을 아는 것이 도움이됩니다. –

답변

7

결과에 원하는 모든 1 시간 슬롯이 들어있는 사전 채워진 테이블 (또는 테이블 결과 세트를 반환하는 함수)이 있어야 참여할 수 있습니다.

그런 다음 OUTER JOIN을 수행하면 모두 가져와야합니다. 이 같은

뭔가 :

SELECT SLOT_HOUR, SUM(order_id) 
FROM 
    ONEHOURSLOTS 
    LEFT JOIN ORDERS ON DATEPART(hh, order_date) = SLOT_HOUR 
GROUP BY SLOT_HOUR 
+0

나는'ONEHOURSLOTS'를'(SLOT_HOUR 조합 1을 SLOT_HOUR 조합으로 선택한다. ..)'과 같은 것으로 대체 할 수 있다고 믿는다. - 단 하나의 쿼리만으로도 그것을 유지하려고한다면 죽는다. -YY : P – Blorgbeard

+0

You 더 쉬운 사용자 generate_series()를 수행 할 수 있습니다 (태그가 여러분이 말하는 포스트그레스를 가정하고 있지만 예제 쿼리는 거기서 작동하지 않습니다 ..) –

2

중 하나, 시간의 테이블을 만들기 지속 또는 '즉시'합성 : 이전 답변 중 일부는 시간의 테이블을 사용하는 것이 좋습니다

SELECT h.hour, s.sum 
FROM (
    SELECT 1 as hour 
    UNION ALL SELECT 2 
    UNION ALL SELECT 3 
    ... 
    UNION ALL SELECT 24) as h 
LEFT OUTER JOIN (
    SELECT datepart(hh, order_date) as hour, SUM(order_id) as sum 
     FROM ORDERS 
     GROUP BY datepart(hh, order_date)) as s 
    ON h.hour = s.hour; 
8

UNION 쿼리를 사용하여 데이터를 채 웁니다. 이것은 공통 표 표현식으로 더 잘 수행 될 수 있습니다 :

; WITH [Hours] ([Hour]) AS 
(
SELECT TOP 24 ROW_NUMBER() OVER (ORDER BY [object_id]) AS [Hour] 
FROM sys.objects 
ORDER BY [object_id] 
) 
SELECT h.[Hour], o.[Sum] 
FROM [Hours] h 
LEFT OUTER JOIN (
    SELECT datepart(hh, order_date) as [Hour], SUM(order_id) as [Sum] 
     FROM Orders 
     GROUP BY datepart(hh, order_date) 
) o 
ON h.[Hour] = o.[Hour] 
+0

+1 sys.objects 트릭. 어느 날 sys.objects에 액세스 할 수있는 사용자 개체 만 표시하고 시스템 개체를 sys.all_objects로 옮겨서 스크립트를 망가뜨릴 수있는 버전을 출시 할 것입니다. –

+0

잘하면 해당 숫자 표 (http : //sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-numbers-table.html)이 있으므로 해킹이 필요하지 않습니다. –