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

SQL - Grouping data by the most recent updates

我的查询有问题(使用 SQL 开发人员)。我有两个表 PERSON 和 DEVICE。 人(person_id,姓名) 设备(device_id、person_id、设备、版本、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。我应该怎么办?我很确定这是可行的。感谢您的帮助!

您可以使用 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;

您可以使用 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;