[英]How do I preserve logical groupings while sorting in SQL?
我有兩個與父子關系相關的表
Sale
sale_id | customer_name
SaleItem
item_id | sale_id | item_type
每個銷售記錄都有一個或多個相應的SaleItem記錄。 我的目標是創建一個Sales列表,其相應的SaleItems顯示為子級。 我可以使用以下查詢執行此操作:
SELECT s.sale_id, s.customer_name, si.item_id, si.item_type
FROM Sale s, SaleItem si
WHERE s.sale_id=si.sale_id
ORDER BY s.sale_id, si.item_id
產生類似這樣的內容(為了清楚起見,添加了空白行):
sale_id | customer_name | item_id | item_type
1 | Sam | 1 | D
1 | Sam | 2 | B
1 | Sam | 3 | D
2 | Nate | 4 | A
2 | Nate | 5 | B
3 | Mike | 6 | B
3 | Mike | 7 | C
4 | Nate | 8 | C
4 | Nate | 9 | D
ORDER BY子句將Sales與訂購的SaleItems進行邏輯分組。 這為我提供了我需要能夠編寫一個可折疊的UI來表示數據的數據:
-Sale 1 - Sam
-B
-B
-D
+Sale 2 - Nate
+Sale 3 - Mike
-Sale 4 - Nate
-C
-D
一切都很好,但是當我想按item_type對列表進行排序時會發生什么呢? 我想得到這樣的結果集(為清楚起見,添加了空白行):
sale_id | customer_name | item_id | item_type
2 | Nate | 4 | A
2 | Nate | 5 | B
3 | Mike | 6 | B
3 | Mike | 7 | C
4 | Nate | 8 | C
4 | Nate | 9 | D
1 | Sam | 1 | D
1 | Sam | 2 | B
1 | Sam | 3 | D
請注意,每個Sale及其對應的SaleItem都在一起。 基本上,我在這里需要做的是將每組Sale + SaleItems視為一個元素,並根據任何列對它們進行智能排序。 由於本質上我們只是在這里對Sales進行排序,而item_type應用於SaleItem,因此我們僅按第一個SaleItem的item_type進行排序,並維持Sale中SaleItems的原始排序順序。 我真的希望這是有道理的。
我有一些問題:
萬分感謝。
嘗試這樣的事情:
SELECT s.sale_id,
s.customer_name,
si.item_id,
si.item_type,
min(si.item_type) OVER (PARTITION BY sale_id) as min_item_type
FROM Sale s, SaleItem si
WHERE s.sale_id=si.sale_id
ORDER BY min_item_type, s.sale_id, si.item_id
它將使您的結果接近於示例所示的結果。
您可以用任何窗口函數(例如max
, first
, last
...)替換min(si.item_type)
以獲得item_type
,它將“描述”每個sale_id
組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.