为每个唯一 ID 选择最近 30 个日期

Posted

技术标签:

【中文标题】为每个唯一 ID 选择最近 30 个日期【英文标题】:Select latest 30 dates for each unique ID 【发布时间】:2020-08-22 14:47:01 【问题描述】:

这是一个示例数据文件

数据包含多个时间戳上具有不同纬度和经度的唯一 ID。我想为每个唯一 ID 选择最近 30 天坐标的行。请帮助我了解如何运行查询。这个日期在 Hive 表中

问候, 阿克谢

【问题讨论】:

您已标记了 4 个 RDBMS,您希望为哪个 RDBMS 提供答案 用您正在使用的数据库标记您的问题。此外,数据库将数据存储在 tables 而不是 files. 逻辑:获取每个 id 的 max(date),然后返回 date >= max(date) -30 的所有行。实现基于 DBMS:相关子查询或窗口聚合。 对不起,我目前正在编写此查询以从配置单元表中提取数据。 【参考方案1】:

根据上面的示例(id=2,3 没有当前年份日期),您可以使用窗口函数 ROW_NUMBER() 为每个 id 编号日期(按日期降序排列)。然后获取最新的 30 个值:

--get all values for each id where num<=30 (get last 30 days for each day)
select * from
(
--numbering each date for each id order by descending
  select *, row_number()over(partition by ID order by DATE desc)num from Table
)X
where num<=30

如果您只需要为每个 id 获取唯一日期(不考虑时间),那么可以试试这个查询:

select * from
(
 --numbering date for each id
 select *, row_number()over(partition by ID order by new_date desc)num
 from
  (
   -- move duplicate using distinct
   select  distinct ID,cast(DATE as date)new_date  from Table
  )X
)Y
where num<=30

【讨论】:

【参考方案2】:

在 Oracle 中,这将是:

SELECT * FROM TEST_DATE1
WHERE DATEUPDT > SYSDATE - 30;

【讨论】:

【参考方案3】:
select * from MyTable 
where
  [Date]>=dateadd(d, -30, getdate());

按 ID 分组并执行聚合,类似这样

select ID, 
       count(*) row_count,
       max(Latitude) max_lat,
       max(Longitude) max_long
from MyTable 
where
  [Date]>=dateadd(d, -30, getdate())
group by ID;

【讨论】:

谢谢@SteveC,我们如何按 ID 分组并获取每个 ID 的 30 天数据。 嗨,我更新了一个使用聚合的例子:)

以上是关于为每个唯一 ID 选择最近 30 个日期的主要内容,如果未能解决你的问题,请参考以下文章

选择具有最近日期的唯一值,按另一个值分组

SQL - 帮助根据比例和唯一 ID 选择随机日期

如何使用 SQL 选择每个唯一日期的唯一会话?

选择在 30 天内每周至少玩 2 次或更多时间的唯一用户。 (SQL/BigQuery)

Postgres:为 ID 选择 n 个唯一行

如何在 Oracle SQL 中不使用 distinct 选择从多个 max(case when) 派生的唯一行