簡體   English   中英

在SQL中排序時如何保留邏輯分組?

[英]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的原始排序順序。 我真的希望這是有道理的。

我有一些問題:

  1. 我會以錯誤的方式處理嗎? 由於每個Sale記錄都是一個或多個SaleItem記錄的“父”記錄,因此JOIN似乎有點過頭了,因為我最終在每個“子”行中重復了“父”數據。
  2. 如何將每個銷售的第一個item_type排序此數據,並且仍然將每個銷售的SaleItem保持在一起?

萬分感謝。

嘗試這樣的事情:

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

它將使您的結果接近於示例所示的結果。

您可以用任何窗口函數(例如maxfirstlast ...)替換min(si.item_type)以獲得item_type ,它將“描述”每個sale_id組。

暫無
暫無

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

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