从Oracle中的Select(not Distinct)中的第一列中删除重复项

Mik*_*ike 4 sql oracle select distinct duplicates

我是Oracle的新手.

我有一个Select作为更大的查询的一部分,它返回以下结果.我的问题是,对于第一列,我只需要每个值的第一次出现(它们按升序排序).结果看起来就像你在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
Run Code Online (Sandbox Code Playgroud)

目前的结果:

在此输入图像描述

要求的结果:

在此输入图像描述

Tim*_*sen 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
Run Code Online (Sandbox Code Playgroud)

戈登的编辑:

我们可以在没有子查询/ 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
Run Code Online (Sandbox Code Playgroud)