簡體   English   中英

SQL-選擇2列的最新不同組合

[英]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_idrole_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM