SQL - 按最新更新对数据进行分组

Posted

技术标签:

【中文标题】SQL - 按最新更新对数据进行分组【英文标题】:SQL - Grouping data by the most recent updates 【发布时间】:2021-10-27 17:29:52 【问题描述】:

我的查询有问题(使用 SQL Developer)。我有两张桌子 PERSON 和 DEVICE。 PERSON(person_id,姓名) DEVICE (device_id, person_id, device, version, udt)

加入的数据如下所示:

但我希望它看起来像这样:

所以基本上我想为每个人设置一行,并且该行需要包含所有设备和最近更新 (udt) 的设备的不同 udt 的详细信息 (Device_newest ) 及其版本 (Latest_version)。

我设法接近这个查询:

    select 
    PERSON.name, 
    max(case when SOFTWARE.device = 'mobile' then udt end) as mobile_udt,
    max(case when SOFTWARE.device = 'computer' then udt end) as computer_udt,
    max(case when SOFTWARE.device = 'laptop' then udt end) as laptop_udt
    
    from SOFTWARE
      left join PERSON on PERSON.person_id = SOFTWARE.person_id

    group by PERSON.name

但它没有 Device_newestLatest_version。我该怎么办?我很确定这是可行的。感谢您的帮助!

【问题讨论】:

您可以使用PIVOT 子句(techonthenet.com/oracle/pivot.php)。如果你愿意,我可以把它写成答案。 【参考方案1】:

您可以在 Oracle 中使用keep 功能。这就是 Oracle 实现“第一个”聚合函数的方式:

select p.name, 
       max(case when s.device = 'mobile' then udt end) as mobile_udt,
       max(case when s.device = 'computer' then udt end) as computer_udt,
       max(case when s.device = 'laptop' then udt end) as laptop_udt,
       max(s.device) keep (dense_rank first order by udt desc) as latest_device,
       max(s.version) keep (dense_rank first order by udt desc) as latest_version
from SOFTWARE s left join
     PERSON p 
     on p.person_id = a.person_id
group by p.name;

【讨论】:

【参考方案2】:

您可以使用 PIVOT 子句 (techonthenet.com/oracle/pivot.php)。 像这样:

SELECT * FROM
(
    select *
    from device
      left join PERSON on PERSON.person_id = device.person_id
)
PIVOT
(
  MAX(udt)
  FOR device IN ('mobile','computer','laptop')
)
ORDER BY name;

【讨论】:

OP 已经能够显示这三列,但不能显示第 4 列和第 5 列。 谢谢。这是正确的。我已经获得了这些最大 udt,但现在我还需要来自每个人的最新 udt 设备的信息。

以上是关于SQL - 按最新更新对数据进行分组的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询根据日期获取最新的 3 次发送,然后对记录进行分组

SQL 检索最新记录,按唯一外键分组

SQL 连接 3 个按最新组值分组的表

SQL:查找按用户分组的最新两个记录之间的差异

按 JSON 数组对 SQL 数据进行分组

在 SQL 中删除重复组