gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:51:18 24 4
gpt4 key购买 nike

我是 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

最佳答案

通常这种格式应该在您的表示层中处理。话虽如此,我们也许可以按如下方式估算您想要的内容:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com