SQL:获取最近一个月的N和这些记录的历史记录

如何解决SQL:获取最近一个月的N和这些记录的历史记录

我想查找最近一段时间的前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;

这使我成为每个时期的前三名。

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
.
.
.

但不是理想的结果。

假设这些是最近一个月的前三名:

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

仅供参考,我正在使用PROC SQL在SAS中工作,因此对我而言,诸如CTE,窗口函数和其他内容之类的细腻内容对我不可用。

解决方法

您可以使用JOIN

SELECT a.*,ar.rank
FROM base_table a JOIN
     (SELECT a.value,COUNT(*) as rank
      FROM base_table a JOIN
           base_table a2 
           ON a.period = a2.period and a.value <= a2.value JOIN
           (SELECT max(a3.period) as max_period
            FROM base_table a3
           ) a3
           ON a3.max_period = period
      GROUP BY a.value
      HAVING COUNT(*) <= 3
     ) ar
     ON ar.value = a.value
ORDER BY period,rank;

我怀疑使用data步骤会更简单,至少对于分配等级而言。

,

您可以尝试使用子查询吗?如果不是这样,您可以创建一个视图,而不是使用一些row_number()/ rank函数进行排序

SELECT b.period,b.name,b.value
FROM base_table b
INNER JOIN
(  
    -- subquery to get last period 
    SELECT TOP 3 name,period,value
    FROM base_table
    WHERE period = (SELECT MAX(period) FROM base_table)
    ORDER BY 3 DESC
) AS s ON s.name = b.name -- join them
,

不确定为什么要为此使用SQL。这是使用PROC SQL的OUTOBS选项的方法。

首先让我们做一些实际的测试数据:

data have ;
  input period :ddmmyy. name $ value rank ;
  format period yymm7. ;
cards;
01092020   Joe    100      1
01092020   Jane   90       2
01092020   Doe    80       3
01082020   Joe    95       4
01082020   Jane   94       5
01082020   Doe    7        50
01092019  Joe     42       20
01092019  Doe     34       35
01092019  Jane    1        100
;

现在让我们将N设置为宏变量以使其更具灵活性。由于示例数据仅包含3个名称,因此我们使用N的2。

%let n=2;

因此,首先找到最近(最大)时间段的前N个。

proc sql;
reset outobs=&n;
create table top&n as select name
  from have 
  having period=max(period)
  order by value desc
;

现在将OUTOBS重置为MAX,并使用该TOPn列表从这些名称的原始数据集中提取所有数据。

reset outobs=max;
create table want as 
select * from have
where name in (select name from top&n)
;
quit;

让我们看看结果:

proc print data=want;
run;

哪个是

Obs     period    name    value    rank

 1     2020M09    Joe      100        1
 2     2020M09    Jane      90        2
 3     2020M08    Joe       95        4
 4     2020M08    Jane      94        5
 5     2019M09    Joe       42       20
 6     2019M09    Jane       1      100

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res