簡體   English   中英

在數據庫中按分組日期排序

[英]ordering by grouped dates in database

嗨,有一個與此問題類似的問題

SQL中棘手的“分組”排序

但似乎無法使其與日期一起使用

我的桌子有點

Car_ID   Car_Brand   Car_Model   Car_launch_date
   1     Ford        Fiesta      12-12-2011
   2     Ford        Mustang     09-04-2008
   3     Ford        Focus       10-02-2012
   4     Honda       Civic       11-05-2012
   6     Honda       Jazz        02-05-2011
   7     Toyota      Prius       11-10-2011

我希望我的結果按最接近現在的將來日期排序,然后再跟最接近現在的過去日期排序(並按品牌分組)

我希望我的輸出是這樣的:

Car_ID   Car_Brand   Car_Model   Car_launch_date
   7     Toyota      Prius       11-10-2011
   1     Ford        Fiesta      12-12-2011
   3     Ford        Focus       10-02-2012
   2     Ford        Mustang     09-04-2008
   4     Honda       Civic       11-05-2012
   6     Honda       Jazz        02-05-2011

您在數據庫中的DATEDATE對象還是字符串? 因為如果您嘗試將它們作為字符串訂購,那將行不通!

如果日期是DATE ,請嘗試:

SELECT * from my_table
ORDER BY Car_Brand DESC, 
         Car_launch_date < NOW(), 
         ABS(DATEDIFF(Car_launch_date, NOW()))

如果它們是字符串,請嘗試:

SELECT * from my_table
ORDER BY Car_Brand DESC, 
         DATE(Car_launch_date) < NOW(), 
         ABS(DATEDIFF(DATE(Car_launch_date), NOW()))

當您在一個排序依據中指定多個列時,如果第一列中的值相同,則它將按第一列排序,然后按第二列排序。

此訂單的排序方式-汽車品牌,然后-日期是否過去。 虛假首先被排序。 (因此,未來優先),然后-日期的絕對差(最小的數字優先)

注意:我放Car_Brand DESC (反向字母順序),因為這就是上面的方法。

感謝OP的發現,您想要更復雜的訂單。 但我認為這樣更好:)

使用以前的帖子作為補充,更好的答案是:

GROUP BY Car_Brand 
ORDER BY 
CASE WHEN Car_launch_date >= NOW() THEN 0 ELSE 1 END, 
CASE WHEN Car_launch_date >= NOW() THEN DATEDIFF(Car_launch_date, NOW()) ELSE DATEDIFF(NOW(), Car_launch_date) END

該查詢使用條件語句來首先確定它是將來的日期還是過去的日期。 如果是將來,則輸出0,過去則輸出1,因此將來的日期將排在第一位,過去的日期將排在第二位。 接下來是另一個case語句,用於檢測如何計算現在和啟動日期之間的天數差。

暫無
暫無

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

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