簡體   English   中英

如何通過 created_at 對一組行進行排序?

[英]How to order a group of rows by created_at?

我的訪問表如下所示:

ID 姓名 網絡服務商 created_at
1 傑克 康卡斯特 2021-03-13 01:00:00
2 傑克 康卡斯特 2021-03-13 01:01:00
3 湯姆 康卡斯特 2021-03-13 01:02:00
4 吉爾 亞馬遜 2021-03-13 01:03:00
5 傑克 康卡斯特 2021-03-13 01:50:00
6 吉爾 亞馬遜 2021-03-13 01:06:00
7 傑克 康卡斯特 2021-03-14 01:00:00

我想將“isp”分組在一起,然后根據每個組和組內第一行的最新 created_at 對組進行排序,按“created_at”和“名稱”排序。 結果表應如下所示

ID 姓名 網絡服務商 created_at
1 傑克 康卡斯特 2021-03-13 01:00:00
2 傑克 康卡斯特 2021-03-13 01:01:00
5 傑克 康卡斯特 2021-03-13 01:50:00
7 傑克 康卡斯特 2021-03-14 01:00:00
3 湯姆 康卡斯特 2021-03-13 01:02:00
4 吉爾 亞馬遜 2021-03-13 01:03:00
6 吉爾 亞馬遜 2021-03-13 01:06:00

我有以下代碼要按“isp”訂購,但我一直堅持如何根據第一個“created_at”訂購 isp 組。

SELECT * FROM visits
ORDER BY isp

您可以使用 window 函數:

order by max(created_at) over (partition by ip) desc,
         ip,
         max(created_at) over (partition by ip, name) desc,
         name,
         created_at desc

這些鑰匙是什么?

  • 每個ip的最大created_at
  • 然后ip所以在平局的情況下,給定ip的所有行都在一起。
  • 每個ip的每個名稱的最大created_at
  • 然后name ,使每個名稱的行都在一起。
  • 最后, created_at

如果您的 MySql 版本為 8.0+,請在ORDER BY子句中使用MAX() window function:

SELECT *
FROM visits
ORDER BY MAX(created_at) OVER (PARTITION BY isp) DESC, name, created_at

對於早期版本,使用相關子查詢:

SELECT v1.*
FROM visits v1
ORDER BY (SELECT MAX(v2.created_at) FROM visits v2 WHERE v2.isp = v1.isp) DESC, 
         name, created_at

請參閱演示

ID 姓名 網絡服務商 created_at
1 傑克 康卡斯特 2021-03-13 01:00:00
2 傑克 康卡斯特 2021-03-13 01:01:00
5 傑克 康卡斯特 2021-03-13 01:50:00
7 傑克 康卡斯特 2021-03-14 01:00:00
3 湯姆 康卡斯特 2021-03-13 01:02:00
4 吉爾 亞馬遜 2021-03-13 01:03:00
6 吉爾 亞馬遜 2021-03-13 01:06:00

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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