[英]Getting a distinct code-name pair but sorting on other columns
我在編寫查詢時有些困惑(SQL不是我的強項)。
說我有以下TABLE1
:
CODE NAME SCOPE1 SCOPE2 SEQ
------------------------------------
A a Here 1
B b Here 2
C c Here 3
C c Room 1
A aa Room 2
B bbb Room 3
業務密鑰是CODE + SCOPE1 + SCOPE2
,其中SCOPE1
和SCOPE2
始終是互斥的。
鑒於我需要按SCOPE1
, SCOPE2
和SEQ
排序,如何得到CODE
和NAME
的不同結果?
也就是說,給定SCOPE1 = 'Here'
和SCOPE2 = 'Room'
,我想得到以下結果:
CODE NAME
---------
A a
B b
C c
A aa
B bbb
注意:不需要Room
C c
,因為它與Here
C c
重復。
我確實意識到將DISTINCT
與ORDER BY
結合使用的局限性,我能想到的最好的方法如下:
select distinct CODE, NAME from
(
select CODE, NAME from MYTABLE
where (SCOPE1='Here' or SCOPE2='Room')
order by SCOPE1, SCOPE2, SEQ
);
上面產生正確的對,但順序錯誤。 我嘗試弄亂GROUP BY
,但我想我還不夠了解。
我必須堅持使用標准SQL(也就是說,沒有產品專用的SQL構造,除非是Oracle,否則),並且我猜想使用此特定查詢可能無法避免子選擇。
我將不勝感激任何指針。 提前致謝。
更新:我已經更新了數據集,根據peterm的回答,到目前為止,這是我所擁有的: sqlfiddle 。 當我開始調整序列時,MIN / MAX技巧不起作用。
假定我將始終搜索一個特定的SCOPE1
與一個特定的SCOPE2
配對。 但是我需要所有SCOPE1
記錄都出現在SCOPE2
之前。 這個想法是,我不在乎是否CODE + NAME
來自SCOPE1
或SCOPE2
-我只是想唯一對由分類SCOPE1
, SCOPE2
和SEQ
。
更新基於您對Oracle的更新要求
SELECT CODE, NAME
FROM
(
SELECT CODE, NAME,
ROW_NUMBER() OVER (ORDER BY SCOPE1, SCOPE2, SEQ) rnum
FROM Table1
WHERE SCOPE1='Here'
OR SCOPE2='Room'
) q
GROUP BY CODE, NAME
ORDER BY MIN(rnum)
使它在SQL Server中以相同的方式工作
SELECT CODE, NAME
FROM
(
SELECT CODE, NAME,
ROW_NUMBER() OVER (ORDER BY CASE WHEN SCOPE1 IS NULL
THEN 1 ELSE 0 END, SCOPE1,
CASE WHEN SCOPE2 IS NULL
THEN 2 ELSE 3 END, SCOPE2, SEQ) rnum
FROM Table1
WHERE SCOPE1='Here'
OR SCOPE2='Room'
) q
GROUP BY CODE, NAME
ORDER BY MIN(rnum)
輸出:
| CODE | NAME | --------------- | A | a | | B | b | | C | c | | A | aa | | B | bbb |
原始答案:根據您對需求的描述,我唯一想到的就是
SELECT CODE, NAME
FROM Table1
WHERE SCOPE1='Here'
OR SCOPE2='Room'
GROUP BY CODE, NAME
ORDER BY MIN(SCOPE1), MIN(SCOPE2), MIN(SEQ)
這是SQLFiddle演示(MySql)
這是SQLFiddle演示(SQL Server)
這是SQLFiddle演示(Oracle)
現在在MySql和SQL Server中,默認情況下首先使用NULL
,因此您將獲得
| CODE | NAME | --------------- | B | bbb | | A | a | | B | b | | C | c |
在Oracle NULL
,默認情況下走最后一個,因此您將獲得
| CODE | NAME | --------------- | A | a | | B | b | | C | c | | B | bbb |
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.