【问题标题】:Filter counts per day and counts per month每天过滤计数和每月计数
【发布时间】:2018-02-07 07:57:32
【问题描述】:

我正在尝试过滤带有 ID 和日期的表格。我的问题是;一个月内出现了多少个唯一 ID?我从数据库中拿了一个小sn-p,可以在这篇文章的底部查看。

条件

  • 每天计算一个唯一 ID。这意味着即使一个 Id 一天出现 2 次,我们也只会将该 Id 算作当天的一次

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

感觉好像有一个简短的方法来执行这个,我想学习。到目前为止,我已将日期拆分为较短的 varchar,例如“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 |
+-------------------------+-----+

谢谢!

【问题讨论】:

  • “一个月内显示了多少个唯一 ID”与“每天仅计算一个唯一 ID”和“仅计算每月显示至少 2 次的 Id”...

标签: sql sql-server datetime group-by


【解决方案1】:

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

但是您想在同一天将项目合并在一起,因此 COUNT(DISTINCT DAY(Dates)) 会为您提供所需的数字,例如143 在 2018-01 年出现一次(均在 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 |

【讨论】:

  • 哇,喜欢你的解决方案!从中学到了很多!非常感谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
相关资源
最近更新 更多