我是 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
当前结果:
所需结果:
最佳答案
通常这种格式应该在您的表示层中处理。话虽如此,我们也许可以按如下方式估算您想要的内容:
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
戈登的编辑:
我们可以使用
ROW_NUMBER()
在没有子查询/CTE 的情况下编写此代码。直接在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
关于sql - 从 Oracle 的 Select (not Distinct) 中的第一列中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44612505/