【问题标题】:remove multiple duplicate columns sql删除多个重复的列sql
【发布时间】:2022-01-14 23:10:49
【问题描述】:
UUID    DEVICE_ID   DT
900 600        7
900 900        5
900 600        5
900 900        7
900 400        7
900 800        5
901 800        7
901 900        7
901 400        5
901 400        7
901 800        5

答案应该是 dt 的最大值,并且没有重复的 uuid 和 device_id 例如:

900 900        7
901 800        7

【问题讨论】:

  • mysql OR sqllite?
  • select uuid,max(device_id) device_id,max(dt)dt from your_table
  • 嗨,p.salmon mysql
  • 你好 akina 也可以回答
  • @Akina in uuid 如果出现 900,它不应该再次出现与 devcice_id 相同

标签: mysql sql duplicates add


【解决方案1】:

使用ROW_NUMBER:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY UUID ORDER BY DT DESC) rn
    FROM yourTable
)

SELECT UUID, DEVICE_ID, DT
FROM cte
WHERE rn = 1;

【讨论】:

  • 这只会删除 UUID 中的重复项,但不会删除 device_id 中的重复项
  • ...那么你应该显示你真正想要的输出。我的查询确实生成了您上面显示的输出。
  • @venkatM 此查询为每个 UUID 提供一行 - 因此 DEVICE_ID 在该组中是唯一的。
  • 我给出了示例输出。我想要一个返回在 UUID 和 device_id 中没有重复记录的查询
  • @venkatM 示例输出不够。必须提供完整详细的解释,目前的解释太片面了。
【解决方案2】:

您可以使用几个公用表表达式 (CTE) 作为占位符来获得正确的结果。

例如,下面的第一个 CTE 选择所有设备,包括每个 UUID 的最大 DT。 第二个CTE选择最大DT对应的设备。 第三个 CTE 提供删除所有重复 UUID 和 DEVICE_ID 的逻辑,确保一旦选择了 DEVICE_ID,随后的 UUID 将忽略它。

WITH AllDevice AS (
SELECT *,
MAX(DT) OVER (PARTITION BY UUID ORDER BY UUID) AS max_dt
FROM yourTable
),
MaxDT AS (
SELECT * 
FROM AllDevice
WHERE DT = max_dt
),
NoDuplicates AS (
SELECT MIN(UUID) OVER (PARTITION BY DEVICE_ID ORDER BY DEVICE_ID) AS UUID,
       DEVICE_ID, max_dt AS DT
FROM MaxDT)
SELECT UUID, MAX(DEVICE_ID) AS DEVICE_ID, MAX(DT) AS DT
FROM NoDuplicates
GROUP BY UUID;

见Demo

结果

UUID |设备_ID | DT ---: | --------: | -: 900 | 900 | 7 901 | 800 | 7

【讨论】:

    猜你喜欢
    • 2015-03-13
    • 2020-09-14
    • 2019-01-19
    • 2018-07-15
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    相关资源
    最近更新 更多