Sql-Server
您如何實現自定義排序,對來自其他來源的匹配記錄進行分組
這顯然是簡化的。我有 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;