如何对从 1 到 n 次出现的次数进行排序

Posted

技术标签:

【中文标题】如何对从 1 到 n 次出现的次数进行排序【英文标题】:How to order occurrences counting from 1 to n occurrences 【发布时间】: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)如果是这样,希望它们如何处理? 【参考方案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

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

【讨论】:

提问者问的不是这个。

以上是关于如何对从 1 到 n 次出现的次数进行排序的主要内容,如果未能解决你的问题,请参考以下文章

数字在排序数组中出现的次数

从1到n整数中1出现的次数

从1到非负整数n中1出现的次数 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数? 为此他特别数了一下1~13中包含1的数字有110111213因此共出现6次, 但

整数中1出现的次数(从1到n整数中1出现的次数)

剑指offer-整数中1出现的次数(从1到n整数中1出现的次数)

[算法]数组中出现次数超过一半的数字