首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >计数按日期和小时分组的行数

计数按日期和小时分组的行数
EN

Stack Overflow用户
提问于 2013-09-04 08:02:46
回答 3查看 147关注 0票数 0

我正在2008 R2中跟踪客户存储条目数据,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

我不想数OUT行,只想数IN

我认为它需要在DateDoorID上分组,然后得到总时数。

我希望它能像这样出来。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-04 08:06:56

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;

当然,如果您需要所有时间,即使没有表示行,这里有一个解决方案(将任何一天的输出限制在当天至少有一个IN条目的门上):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
;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;
票数 3
EN

Stack Overflow用户

发布于 2013-09-04 08:13:47

像这样的事怎么样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2013-09-04 08:06:57

这应该能行。我猜到了如何提取DoorID和TotalPersons,但是总体逻辑是正确的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18618675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文