簡體   English   中英

優先區分不同的SQL查詢

[英]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.

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