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)
目前的结果:
要求的结果:
通常,这种格式应该在表示层中处理.话虽这么说,我们也许可以按照以下方式估算你想要的东西:
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)
| 归档时间: |
|
| 查看次数: |
700 次 |
| 最近记录: |