2017-06-18 96 views
4

我是新來的Oracle取下第一列重複。中選擇(不顯着)在甲骨文

我有一個選擇作爲更大的查詢的一部分,返回以下結果。我的問題是,對於第一列,我只需要每個值的第一次出現(它們按升序排序)。結果應該看起來像你在Excel中刪除重複項時得到的結果(Distinct在這裏不起作用,我想,因爲我仍然需要單獨的其他行)。

誰能告訴我怎樣才能做到這一點?

我的查詢(縮短):

Select 
    p.ID 
    , p.SUB_ID 
    , p.ITEM_NAME AS ITEM 
    , p.ITEM_PRICE AS PRICE 
    /* ... */ 
FROM 
    PRICE_LIST p 
WHERE 
    /* ... */ 
GROUP BY 
    p.ID 
    , p.SUB_ID 
    , p.ITEM_NAME 
    , p.ITEM_PRICE 
    /* ... */ 
ORDER BY 
    p.ID, p.SUB_ID 

當前的結果:

enter image description here

要求的結果:

enter image description here

+0

我**認爲**您只需要GROUP BY p.ID而不是其他人。但我遠離SQ專家,所以我只是在黑暗中刺傷。 –

回答

5

通常這種格式應該在您的表示層處理。話雖這麼說,我們也許能夠接近你想要什麼如下:

WITH cte AS (
    SELECT DISTINCT 
     p.ID, p.SUB_ID, p.ITEM_NAME AS ITEM, p.ITEM_PRICE AS PRICE, 
     ROW_NUMBER() OVER (PARTITION BY p.ID ORDER BY p.SUB_ID) rn 
    FROM PRICE_LIST p 
    WHERE 
    /* ... */ 
) 
SELECT 
    CASE WHEN t.rn = 1 THEN TO_CHAR(t.ID) ELSE '' END AS ID, 
    t.SUB_ID, t.ITEM, t.PRICE 
FROM cte t 
ORDER BY 
    t.ID, 
    t.SUB_ID 

戈登編輯:

我們可以只寫這個沒有一個子查詢/ CTE可言,直接在使用ROW_NUMBER()CASE表達式:

SELECT DISTINCT 
    CASE WHEN ROW_NUMBER() OVER (PARTITION BY p.ID ORDER BY p.SUB_ID) = 1 
     THEN TO_CHAR(p.ID) ELSE '' END AS ID, 
    p.SUB_ID, p.ITEM_NAME AS ITEM, p.ITEM_PRICE AS PRICE 
FROM PRICE_LIST p 
WHERE 
    /* ... */ 
ORDER BY 
    p.ID, 
    p.SUB_ID 
+0

非常感謝,蒂姆 - 這是完美的,正是我所期待的。 :) – Mike

+0

謝謝,蒂姆。是的,仍然有效,實際上這確實是必需的。 – Mike

+1

Tim。 。 。假設查詢不需要'SELECT DISTINCT',那麼子查詢/ CTE就沒有必要了。 'row_number()'可以直接在'CASE'中。 –

0
SELECT 
     DECODE(RN, 1, ID, '') AS ID 
    , SUB_ID 
    , ITEM 
    , PRICE 
    , RN 
FROM (
    Select 
     p.ID 
     , p.SUB_ID 
     , p.ITEM_NAME AS ITEM 
     , p.ITEM_PRICE AS PRICE 
     /* ... */ 
     , ROW_NUMBER() OVER(PARTITION BY P.ID ORDER BY P.SUB_ID) AS RN 
    FROM 
     PRICE_LIST p 
    WHERE 
     /* ... */ 
    GROUP BY 
     p.ID 
     , p.SUB_ID 
     , p.ITEM_NAME 
     , p.ITEM_PRICE 
     /* ... */ 
    ORDER BY 
     p.ID, p.SUB_ID 
    )