Sql-Server

您如何實現自定義排序,對來自其他來源的匹配記錄進行分組

  • August 10, 2016

這顯然是簡化的。我有 2 個應用程序:驅動程序和匹配。我按此順序向使用者提供數據,並要求他們選擇 Match 應用程序中的哪些人與 Driver 應用程序中的人真正匹配。數據需要按如下所示進行排序:驅動程序行需要按 PersonName 的 alpha 順序排列。在每個 Driver 記錄下方,按 PersonName alpha 順序列出具有相同 PersonMatchID 的匹配記錄。某些驅動程序記錄將沒有對應的匹配記錄。

如果您以隨機順序從下面的行開始,您將如何編寫 SQL 查詢以按此順序返回它們?我最多處理大約 3000 行,所以我不必過分擔心優化。

Source-system    PersonName    PersonPossibleMatchID
-------------    ----------    ---------------------
Driver           AA            77777
 Match          AA            77777
Driver           AB            11111
 Match          AA            11111
Driver           BB            33333
 Match          BA            33333
 Match          BB            33333
Driver           CC            99999
 Match          CB            99999
 Match          CC            99999
 Match          CD            99999
Driver           DD            44444
Driver           EE            22222

我試過了

SELECT * ORDER BY LEFT(PersonName,1), PersonPossibleMatchId, 源系統

但這不會以嚴格的字母順序返回驅動程序記錄-您首先獲得所有 A,但其中第二個字母的順序是隨機的。例如,在上面的列表中,我可能將 Driver AB 列在 Driver AA 之前。

補充:我正在使用 MS SQL (2012)

這是另外兩種可能性

SELECT [Source-System],
      PersonName,
      PersonPossibleMatchID
FROM   #src
ORDER  BY MAX(CASE
               WHEN [Source-system] = 'Driver'
                 THEN PersonName
             END) OVER (PARTITION BY PersonPossibleMatchId) ASC,
         [Source-System] DESC,
         PersonName ASC 

線上展示

  • 要麼 -
WITH DriverPersonNames
    AS (SELECT PersonPossibleMatchID,
               PersonName
        FROM   #src
        WHERE  [Source-System] = 'Driver')
SELECT s.*
FROM   #src s
      JOIN DriverPersonNames d
        ON d.PersonPossibleMatchID = s.PersonPossibleMatchID
ORDER  BY d.PersonName ASC,
         [Source-System] DESC,
         s.PersonName ASC

線上展示

假設每個驅動程序記錄只有一個PersonPossibleMatchID並且PersonPossibleMatchID不可為空,則兩者都將返回相同的結果。

(從jyao的答案借來的線上展示的DDL)

甲骨文解決方案:

SELECT sourcesystem, personname, personpossiblematchid
  , MAX(DECODE(SourceSystem,'Driver',personname, NULL)) 
     OVER (PARTITION BY PersonPossibleMatchID) driverpn 
FROM x ORDER BY 4,DECODE(sourcesystem,'Driver',1,2),3,2;

數據:

drop table x;
create table x (sourcesystem varchar2(10), personname varchar2(2), personpossiblematchid number(5));
insert into x values ('  Match','BB',33333);
insert into x values ('Driver','CC',99999);
insert into x values ('  Match','CB',99999);
insert into x values ('  Match','CC',99999);
insert into x values ('  Match','CD',99999);
insert into x values ('Driver','DD',44444);
insert into x values ('Driver','EE',22222);
insert into x values ('Driver','AA',77777);
insert into x values ('  Match','AA',77777);
insert into x values ('Driver','AB',11111);
insert into x values ('  Match','AA',11111);
insert into x values ('Driver','BB',33333);
insert into x values ('  Match','BA',33333);

commit;

引用自:https://dba.stackexchange.com/questions/146312