[英]SQL- Select newest distinct combination of 2 columns
我有一个带有以下各列的SQL表。 这4行适用于1位用户。
| id | user_id | role_id | preference_order | updated_at |
|----|---------|---------|------------------|---------------------|
| 83 | 45 | 7 | 1 | 2016-10-24 03:29:18 |
| 84 | 45 | 10 | 2 | 2016-10-24 03:29:18 |
| 85 | 45 | 7 | 1 | 2016-10-25 05:40:18 |
| 86 | 45 | 10 | 2 | 2016-10-25 05:40:18 |
选择user_id
和role_id
的最新不同组合的快速方法是什么-那么第85行和第86行?
我可以得到的最接近的查询是此查询,但它改为获取行83和84:
SELECT *
FROM user_role UR
GROUP BY UR.user_id, UR.role_id
我也尝试过,它得到85和86,但是对于一张大桌子来说似乎太慢了:
SELECT *
FROM user_role UR
JOIN (SELECT user_id, role_id, max(updated_at) updated_at FROM user_role GROUP BY user_id, role_id) UR2
ON UR.user_id = UR2.user_id AND UR.role_id = UR2.role_id AND UR.updated_at = UR2.updated_at
ORDER BY UR.order ASC;
如果需要根据最大updated_at的多个user_id,role_id,则可以尝试此查询:
SELECT DISTINCT user_id,role_id,MAX(updated_at) from user_role group by user_id,role_id;
SELECT DISTINCT *
FROM user_role
NATURAL JOIN
( SELECT user_id, role_id,
MAX( updated_at ) AS updated_at
FROM user_role
GROUP
BY user_id, role_id ) AS t;
利用row_number()并按user_id和role_id对其进行分区
select *
from
(
select *, rn = row_number () over (partition by user_id, role_id
order by updated_at desc)
from your_table
) t
where t.rn = 1
尝试这个
select
id , user_id , role_id , ord, updated_at
from
(
SELECT * ,
ROW_NUMBER() OVER ( PARTITION BY ID ORDER BY pdated_at DESC ) as RID
FROM user_role UR
)A
where RID in ('1','2')
在子查询中按update_at排序,然后在主查询中按分组。
select * from (
select * from user_role order by user_id asc ,role_id asc,updated_at desc
)UR GROUP BY UR.user_id, UR.role_id
SELECT *
FROM user_role UR
LEFT JOIN user_role UR2 ON UR.user_id=UR2.user_id
and UR.role_id=UR2.role_id
and UR.updated_at<UR2.updated_at
WHERE UR2.updated_at IS NULL
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.