Counting number of rows grouped by date and hour

半世苍凉 提交于 2019-12-13 02:57:36

问题


I am tracking customer store entry data in Microsoft SQL Server 2008 R2 that looks something like this:

DoorID        DateTimeStamp               EntryType
1             2013-09-02 09:01:16.000     IN
1             2013-09-02 09:04:09.000     IN
1             2013-09-02 10:19:29.000     IN
1             2013-09-02 10:19:30.000     IN
1             2013-09-02 10:19:32.000     OUT
1             2013-09-02 10:26:36.000     IN
1             2013-09-02 10:26:40.000     OUT

I don't want to count the OUT rows, just IN.

I believe that it needs to be grouped on Date, and DoorID, then get the hours totals.

I would like it to come out like this.

Date        DoorID  HourOfDay TotalInPersons
2013-09-02  1       0         0
2013-09-02  1       1         0
2013-09-02  1       2         0
2013-09-02  1       3         0
2013-09-02  1       4         0
2013-09-02  1       5         0
2013-09-02  1       6         0
2013-09-02  1       7         0
2013-09-02  1       8         0
2013-09-02  1       9         2
2013-09-02  1       10        3
2013-09-02  1       11        0
2013-09-02  1       12        0
2013-09-02  1       13        0
2013-09-02  1       14        0
2013-09-02  1       15        0
2013-09-02  1       16        0
2013-09-02  1       17        0
2013-09-02  1       18        0
2013-09-02  1       19        0
2013-09-02  1       20        0
2013-09-02  1       21        0
2013-09-02  1       22        0
2013-09-02  1       23        0

回答1:


SELECT 
  [Date] = CONVERT(DATE, DateTimeStamp), 
  DoorID,
  HourOfDay = DATEPART(HOUR, DateTimeStamp),
  TotalInPersons = COUNT(*)
FROM dbo.tablename
WHERE EntryType = 'IN'
GROUP BY 
  CONVERT(DATE, DateTimeStamp),
  DoorID,
  DATEPART(HOUR, DateTimeStamp)
ORDER BY
  [Date], DoorID, HourOfDay;

Of course if you need all hours, even where no rows are represented, here is one solution (which limits the output for any day only to the doors that have at least one IN entry on that day):

;WITH h AS 
(
  SELECT TOP (24) h = number FROM Master..spt_values 
  WHERE type = N'P' ORDER BY number
),
doors AS
(
  SELECT DISTINCT DoorID, [Date] = CONVERT(DATE,DateTimeStamp) 
  FROM dbo.tablename WHERE EntryType = 'IN'
)
SELECT 
  d.[Date],
  d.DoorID,
  HourOfDay = h.h,
  TotalInPersons = COUNT(t.EntryType) 
FROM doors AS d CROSS JOIN h
LEFT OUTER JOIN dbo.tablename AS t
ON CONVERT(DATE, t.DateTimeStamp) = d.[Date]
AND t.DoorID = d.DoorID
AND DATEPART(HOUR, t.DateTimeStamp) = h.h
AND t.EntryType = 'IN'
GROUP BY d.[Date], d.DoorID, h.h
ORDER BY d.[Date], d.DoorID, h.h;



回答2:


How about something like this:

SELECT 
  CAST(DateTimeStamp AS DATE) AS Date
  ,DoorID        
  ,DATEPART(HOUR, DateTimeStamp) AS HourOfDay
  ,COUNT(*) AS TotalInPersons
FROM StoreTable
WHERE EntryType = 'IN'
GROUP BY
  CAST(DateTimeStamp AS DATE)
  ,DoorID        
  ,DATEPART(HOUR, DateTimeStamp)



回答3:


This should work. I guessed on how you would pull DoorID and TotalPersons, but the overall logic is correct

SELECT CONVERT(date,dateColumn) AS Date, 
  datepart(hh,dateColumn) AS HourOfDay, 
  DoorID,
  COUNT(people) AS TotalPersons
FROM yourtable
WHERE EntryType = 'IN'
GROUP BY CONVERT(date,dateColumn), datepart(hh,dateColumn), DoorID
ORDER BY CONVERT(date,dateColumn), datepart(hh,dateColumn)


来源:https://stackoverflow.com/questions/18618675/counting-number-of-rows-grouped-by-date-and-hour

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!