如何对从 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~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数? 为此他特别数了一下1~13中包含1的数字有110111213因此共出现6次, 但