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_newest和Latest_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;
我的查询有问题(使用 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_newest和Latest_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;