【发布时间】:2020-09-18 11:03:50
【问题描述】:
我想找到最近一段时间的前 N 个名称(具有最高值的名称)。对于这些名称,我想获得历史价值。
根据这个问题Select top 10 records for each category
我尝试了以下方法:
base_table (period, name, value)
CREATE VIEW TOP3 AS
SELECT DISTINCT a.*, COUNT(*) as rank
FROM base_table AS a
LEFT JOIN base_table AS a2
ON a.period = a2.period and a.value <= a2.value
GROUP BY a.value
HAVING COUNT(*) <= 3
ORDER BY period, rank;
这让我在每个时期都排在前 3 名。
period | name | value | rank
092020 Joe 100 1
092020 Jane 90 2
092020 Doe 80 3
082020 Jan 100 1
082020 Doc 99 2
082020 Pete 98 3
.
.
.
但不是想要的结果。
假设这些是最近一个月的前 3 名:
period | name | value | rank
092020 Joe 100 1
092020 Jane 90 2
092020 Doe 80 3
现在我想获取这些的历史记录,即使它们在上个月的前 3 名之外,如下所示:
period | name | value | rank
092020 Joe 100 1
092020 Jane 90 2
092020 Doe 80 3
082020 Joe 95 4
082020 Jane 94 5
082020 Doe 7 50
. . . .
. . . .
. . . .
092019 Joe 42 20
092019 Doe 34 35
092019 Jane 1 100
仅供参考,我在 SAS 中工作,使用 PROC SQL,因此我无法使用 CTE、窗口函数和其他东西等细节。
【问题讨论】:
-
那些 PERIOD 值是什么? 092020 和 082020 是什么意思?那些应该是约会?这些值是否可以按原样进行排序,或者您是否首先需要将它们转换为实际日期,或者至少是另一个正确排序的字符串?
-
只有傻瓜才会将日期存储为 MMYYYY,因为最新日期不是最高值的日期(122019 比 012020 的值更高)。为了任何不得不接触此数据或代码的人的喜爱,请使用 DATE 数据类型或将其编码为 YYYYMM。