每天过滤计数和每月计数

时间:2018-02-07 07:57:32

标签: sql sql-server datetime group-by

我尝试使用ID和日期过滤表格。我的问题是;一个月内出现了多少独特的ID?我从数据库中拿了一个小片段,可以在这篇文章的底部查看。

条件

  • 每天计算一次唯一ID。即使ID每天显示2次也是如此,我们仅将Id计为当天的一次

  • 计算每月显示至少 2次的ID。意思是我们排除

感觉执行此操作的方法很短,我想学习。到目前为止,我已将日期拆分为更短的示例" 30-01-2018",我可以在这里过滤掉每个日期的乘数。然后我完成了对不同标签的计数。这似乎有效,但涉及4-5个单独的临时表。是否有更好的方法可以一次性对其进行排序?

数据库

日期日期时间
Id varchar

+-------------------------+-----+
|          Dates          | Id  |
+-------------------------+-----+
| 2018-01-30 08:37:51.450 | 158 |
| 2018-01-31 08:43:04.317 | 158 |
| 2018-01-31 08:32:43.977 | 143 |
| 2018-01-31 12:51:12.720 | 143 |
| 2018-01-30 08:35:51.777 |  89 |
| 2018-01-30 12:47:52.817 | 189 |
| 2018-01-31 08:46:58.913 |  89 |
| 2018-01-31 08:29:23.077 | 109 |
| 2018-01-30 07:10:00.267 |  31 |
| 2018-01-31 06:01:54.813 |  31 |
| 2018-01-31 12:36:04.583 |  31 |
| 2018-01-30 08:07:27.320 | 187 |
| 2018-01-30 08:08:11.917 | 226 |
| 2018-01-30 12:20:00.240 | 226 |
| 2018-01-31 08:17:59.257 | 226 |
| 2018-01-30 09:20:23.577 | 167 |
| 2018-01-31 12:40:30.977 | 167 |
| 2018-01-31 14:02:18.563 | 167 |
+-------------------------+-----+

谢谢!

1 个答案:

答案 0 :(得分:1)

按年份和月份对数据进行分组。然后COUNT(*)会为您提供每月的商品数量,例如在2018 - 01年出现31次,在2018 - 01年出现143次,在2018 - 01年出现了3次,依此类推。

但是您希望在同一天合并项目,COUNT(DISTINCT DAY(Dates))会为您提供所需的数字,例如在2018 - 01年出现了143次(两次都发生在31日)。

SELECT Id, YEAR(Dates) YY, MONTH(Dates) MM, COUNT(DISTINCT DAY(Dates)) AS C
FROM testdata
GROUP BY Id, YEAR(Dates), MONTH(Dates)
HAVING COUNT(DISTINCT DAY(Dates)) >= 2

输出:

| Id  | YY   | MM | C |
|-----|------|----|---|
| 31  | 2018 | 1  | 2 |
| 89  | 2018 | 1  | 2 |
| 158 | 2018 | 1  | 2 |
| 167 | 2018 | 1  | 2 |
| 226 | 2018 | 1  | 2 |