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

标签 sql oracle select duplicates distinct

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

相关文章:

mysql - Rails 应用程序中 mysql 查询性能缓慢

oracle - tomcat 6 dbcp 和 oracle 11 瘦驱动程序的堆空间不足

javascript - 根据选项字符串选择子字符串

c - 如何通知 select() 立即返回?

c++ - 如何轻松学习数组数据库 Rasdaman?

java - JPA 规范等同于 ResultTransformer.DISTINCT_ROOT_ENTITY?

python - SQL 查询在控制台中有效,但在 python 中无效

oracle - 放弃对名称以外的其他内容的 FK 约束

需要 SQL 查询从两个单独的表中获取信息

php - 在格式为 json 的字段中选择多个 ID