【问题标题】:How to order occurrences counting from 1 to n occurrences如何对从 1 到 n 次出现的次数进行排序
【发布时间】:2020-09-23 19:47:35
【问题描述】:

我有一个包含几列的表,但对于任务,重要的是id end created_date,其中id 可以重复。

样本数据:

+--------+--------------+
|  id    | created_date |
+--------+--------------+
| 12345  | 2020-05-01   |
| 12345  | 2020-04-23   |
| 54321  | 2020-05-12   |
| 12345  | 2020-06-13   |
| 54321  | 2020-01-03   |
+--------+--------------+

我需要编写一个查询来创建一个新列,该列枚举每个id 的出现次数,按升序排列created_date。输出必须类似于以下内容:

+--------+--------------+------------------+
|  id    | created_date | occurrence_count |
+--------+--------------+------------------+
| 12345  | 2020-04-23   |                1 |
| 12345  | 2020-05-01   |                2 |
| 12345  | 2020-06-13   |                3 |
| 54321  | 2020-01-03   |                1 |
| 54321  | 2020-05-12   |                2 |
+--------+--------------+------------------+

什么查询会输出这个结果表?

【问题讨论】:

  • 请向我们展示您的尝试。
  • 我没有尝试过,因为我不知道如何去做。我猜也许我必须创建一个我计算的选择并按 id 分组,然后使用它来填充出现计数的列,但我真的不知道该怎么做......
  • 下面的答案可能就是你想要的。标量、相关子查询确实有效,但效率较低:(select count(*) from T t2 where t2.id = T.id and t2.created_date <= T.created_date)
  • “我没有尝试”。所以开始尝试吧。
  • 是否有重复项? (多行相同的id和created_date)如果是这样,希望它们如何处理?

标签: sql sql-server window-functions


【解决方案1】:

你可以使用窗口功能

select t.*,
   row_number() over (partition by id order by created_date asc) as occurrence_count
 from t

【讨论】:

  • 如果这个答案对你有帮助,请考虑将其标记为答案
【解决方案2】:

您可以使用以下查询来计算出现次数:

SELECT id, 
       COUNT(id) AS [occurrence_count]
FROM Table 
GROUP by id

如果您还需要其他列,则可以使用内部连接来完成

【讨论】:

  • 提问者问的不是这个。
猜你喜欢
  • 2018-03-19
  • 1970-01-01
  • 2019-10-25
  • 2017-02-21
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2012-08-04
  • 2019-04-28
相关资源
最近更新 更多