[英]Prioritize Distinct SQL Query
我正在嘗試編寫一個VBA SQL查詢,該查詢將返回不同的記錄,但是我希望能夠對返回的不同記錄進行優先排序。 在這個測試示例中,我想為每個ID返回一個不同的記錄,將年份優先級設置為高級,然后是初級,二年級和新生,然后按C,A,B的順序對術語進行優先級排序。
ID Name Term Year
1 Suzy A Senior
1 Suzy B Junior
2 John C Senior
2 John B Sophomore
3 Pete A Junior
4 Carl C Freshman
5 Sally B Senior
在SQL查詢中使用“ Distinct”運算符時,我不知道它使用什么標准來決定要返回的記錄,或者是否可以像這樣放置優先級。 任何幫助將非常感激。 我想我看到了使用“選擇案例”的可能解決方案,但我不太理解。 如果那是正確的解決方案,我會很樂意使用它,但是如果可能的話,我想對它的工作方式進行解釋。
謝謝!
假設Y是用於對“年份”列進行排序的輔助表:
Year Order
--------- -----
Senior 1
Junion 2
Sophomore 3
Freshman 4
假設X是包含您的數據的表,並且所有行都是不同的(也就是說,X中沒有ID,Name,Term和Year相同的記錄),並且還假定相同的ID表示相同的Name和Vice -versa:
SELECT x1.*
FROM X x1
INNER JOIN Y y1 ON (x1.year = y1.year)
WHERE NOT EXISTS (
SELECT *
FROM X x2
INNER JOIN Y y2 ON (x2.year = y2.year)
WHERE x2.id = x1.id -- could also use "name" instead of id (as one implies the other)
AND (
y2.order < y1.order
OR (y2.order = y1.order AND x2.term < x1.term)
)
)
編輯:
我將通過稍微簡化(概括)上述方案來闡明正在發生的事情。
您要完成的工作是選擇一組輸出行,每個輸出行對於給定鍵都是唯一的。 根據某些排序標准,其他所有列均應來自同一基礎行(輸入行)。
SELECT *
FROM YourTable t1
WHERE NOT EXISTS (
SELECT *
FROM YourTable t2
WHERE t1.key = t2.key -- note that you can have composite keys connecting them with AND
AND (
-- any ordering criteria that will give some sense of
-- this instance t2 is lesser (or have more priority) than
-- the candidate instance t1
)
)
(這是一個非常基本的概念;請讀為“假設每個行都沒有其他小於該行的行,請獲取這些行)”
由於“年份”列沒有自然的排序,因此您的問題變得更加復雜,因此我們必須發明一個。
那就是這個元表的來源:將Year映射到某種順序。
現在,您必須將上面解釋的一般思想應用於擴充表(即,原始的帶有我建議的元表的思想)。
排序條件也具有通用語言。 因為您的訂單具有多個級別(“按此排序,按此斷開聯系”),所以您使用以下常規構造:
(t2.first_criteria < t1.first_criteria)
OR (t2.first_criteria = t1.first_criteria AND t2.second_criteria < t1.second_criteria)
OR (t2.first_criteria = t1.first_criteria AND t2.second_criteria = t1.second_criteria AND t2.third_criteria = t1.third_criteria)
...
(...任何其他類型,嚴格按照第一個條件進行排序,或者按第一個條件進行嚴格划分,但是嚴格按第二個條件進行划分,或者按第一個標准進行嚴格划分,然后按第二個規則進行划分,然后按第三個標准進行划分……)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.