簡體   English   中英

獲取不同的代號對,但在其他列上排序

[英]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 ,其中SCOPE1SCOPE2始終是互斥的。

鑒於我需要按SCOPE1SCOPE2SEQ排序,如何得到CODENAME的不同結果?

也就是說,給定SCOPE1 = 'Here'SCOPE2 = 'Room' ,我想得到以下結果:

CODE NAME
---------
A    a
B    b
C    c
A    aa
B    bbb

注意:不需要Room C c ,因為它與Here C c重復。

我確實意識到將DISTINCTORDER 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來自SCOPE1SCOPE2 -我只是想唯一對由分類SCOPE1SCOPE2SEQ

更新基於您對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)

這是SQLFiddle

使它在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)

這是SQLFiddle

輸出:

| 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.

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