【问题标题】:Way to find rows with a same ID and only keep one row查找具有相同 ID 的行并只保留一行的方法
【发布时间】:2011-07-22 15:20:46
【问题描述】:

我有一个工作查询将从我的数据库中返回一些结果(记录),例如:

123|John Williams|IL|M|06/01/2011|ACTIVE
124|Mary Haque|NY|F|TERMINATED|06/30/2011
124|Mary Haque|NY|F|07/01/2011|ACTIVE
125|Alex Chan|VA|07/01/2011|ACTIVE
126|Rob Kreb|VA|TERMINATED|06/20/2011

如您所见,结果只是一个客户记录列表,而最后两个字段指示成员是活跃还是终止以及关联的活跃/终止日期。

现在的复杂情况是,正如您对于 ID 为 124 的成员 (Mary Haque) 所见,她有两条记录,而对于这种有两条记录的客户,我只想保留该成员处于活动状态的行,而完全无视她终止的历史。因此,例如,上述所需的输出应该是:

123|John Williams|IL|M|06/01/2011|ACTIVE
124|Mary Haque|NY|F|07/01/2011|ACTIVE
125|Alex Chan|VA|07/01/2011|ACTIVE
126|Rob Kreb|VA|TERMINATED|06/20/2011

如您所见,Mary Haque 现在只有她关于结果的活动信息。上面的结果是由 SQL“选择”查询生成的,但我不能简单地将“WHERE status=ACTIVE”附加到这个查询,因为我仍然想保留像上面的 Rob Kreb 这样只有一条记录的成员,即使他被终止。我只希望在某个成员有两条记录时对 TERMINATED 成员记录进行过滤。

仅供参考,我当前的查询如下所示:

SELECT * FROM customer_change WHERE CUSTOMER_LOGIN NOT IN(SELECT CUSTOMER_LOGIN FROM  customer_full WHERE CUSTOMER_LOGIN IS NOT NULL)
UNION
SELECT * FROM customer_change WHERE CUSTOMER_POINTS=0 AND CUSTOMER_LOGIN NOT IN(SELECT CUSTOMER_LOGIN FROM customer_full WHERE CUSTOMER_POINTS=0 AND CUSTOMER_LOGIN IS NOT NULL)

提前感谢您的帮助!

【问题讨论】:

  • 为什么将日期存储为字符串而不是日期?
  • 请修正标题以匹配您的问题。
  • @jeffrey - 这是关于UNION 的非常荒谬的声明。它有一个地方。
  • @Robert:架构在哪里?我很难理解你为什么也在那里使用工会。
  • 以及为什么TERMINATEDACTIVE 出现在两个不同的字段中,并与日期混合在一起。

标签: mysql sql database


【解决方案1】:

colXcolY 是查询的最后 2 列:

SELECT *
FROM (your_UNION_query) AS p
WHERE NOT ( colX = 'TERMINATED'
          AND EXISTS
            ( SELECT *
              FROM (your_UNION_query) AS q
              WHERE q.id = p.id
                AND q.colY = 'ACTIVE'
            )
          )

【讨论】:

  • 我通过将联合查询放在两个 FROM 子句中来运行您的查询,现在结果列表缩小了,但仍然有用户显示两行,其中一行显示已终止。也许我错过了什么?
  • @Robert:哎呀,我错了。编辑答案。立即尝试(应该是 EXISTS 而不是 NOT EXISTS。)
  • :您的解决方案非常完美。我还有一个问题,你可以看看我的后续帖子:stackoverflow.com/questions/6794346/…
【解决方案2】:

这样的事情可以解决问题:

DELETE
FROM tablename
WHERE tablename.status = 'TERMINATED'
    AND tablename.id IN(SELECT
                          id
                        FROM (SELECT
                                t.id
                              FROM tablename t
                              GROUP BY t.id
                              HAVING COUNT(t.id) > 1) AS T1)

假设id是指124125等的字段

【讨论】:

    猜你喜欢
    • 2012-11-04
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2021-12-21
    • 2019-04-02
    相关资源
    最近更新 更多