【问题标题】:SQL - select query / Remove records with duplicate values in desired columnsSQL - 选择查询/删除所需列中具有重复值的记录
【发布时间】:2017-10-31 15:48:33
【问题描述】:

我有大约 15 列的 SQL 表,但以下列很重要:

Id, Area, Action, Timestamp.

Area 代表我的应用程序的实体(用户、文档等),Action 代表用户做了什么(create, view, edit, cancel, etc...). 使用 select 语句我得到了这个数据,它代表了某种历史记录(用户在应用程序上做了什么)。如果我在同一个区域做几个相同的动作,只有时间戳会区分它们(如果我们不考虑时间戳,它们是重复的)。考虑到所需列中的值(例如仅区域、操作),我如何摆脱“重复”记录并仅获取最近的记录(按时间戳)?我使用DISTINCT 尝试了一些查询,但无法实现。

编辑:它是 MSSQL。 我的初始查询是这样的(只有几个重要的列,考虑到还有更多的列):

如果我们只考虑“区域”、“操作”列,就会出现一些“重复”记录。例如多个记录,其中区域为Notice,操作为Details。最终结果应该是按时间戳 (desc) 排序的最后 5 条记录,并且根据 (area, action) 值没有重复。

【问题讨论】:

  • 请出示您的查询
  • 也显示示例数据。原始结果和预期结果。
  • 请Edit您的问题并添加一些sample data 和基于该数据的预期输出。 Formatted text 请no screen shots。 edit 您的问题 - 请不要在 cmets 中提供邮政编码或其他信息。
  • 您使用的是哪个DBMS 产品?后格雷斯?甲骨文? “SQL”只是一种查询语言,并不是特定数据库产品的名称。
  • 我已经编辑了我的问题。它是 MS-SQL,我只需从表中选择 * 即可提供初始查询。

标签: sql select duplicates


【解决方案1】:

您可以将它们组合在一起并选择最大时间戳值

SELECT Id, Area, Action, MAX(timestamp) as max_ts
FROM yourtable
GROUP BY Id, Area, Action

【讨论】:

  • 如果Id, Area, Action, TimeStamp 只是列就可以了,但是正如我在编辑中所写的,表中有更多列。因此,对于您的解决方案,应将其余列添加到 GROUP BY 子句中,否则会报告错误。但如果我添加其余部分,它将再次返回 Area, Action 的重复项。
  • 这行得通。如果 OP 想要其余数据,那么他们应该以此为基础,将其用作子查询并从原始表中检索与此答案的结果匹配的记录。
【解决方案2】:

以下查询将返回您所追求的结果。使用子查询检索 Id/Area/Action 的最新时间戳,然后将子查询连接回原始表以检索其余数据。

SELECT yourtable.*
FROM yourtable
    INNER JOIN (
                    SELECT Id, Area, Action, MAX(timestamp) as max_ts
                    FROM yourtable
                    GROUP BY Id, Area, Action)  maxtimestamp
        ON      yourtable.id = maxtimestamp.id
            AND yourtable.area = maxtimestamp.area
            AND yourtable.Action = maxtimestamp.action
            AND yourtable.timestamp = maxtimstamp.max_ts

感谢 SriniV 对子查询的回答。

【讨论】:

  • 如果我从查询和子查询中删除 Id 列,它似乎可以工作。现在我应该通过TimeStamp (DESC) 将结果集限制为TOP 5。
  • 是的,在子查询或主查询中限制结果集应该会得到你想要的结果。
  • 它有效,我在子查询中限制了它,因为它是我的初始结果集。现在,当我单独执行查询时,它会返回正确的结果,按 timeStamp 递减。但是当我将它放入存储过程(使用事务)时,它会返回正确的记录,但按 ASCENDING 顺序(倒置)。你遇到过这样的问题吗?
  • 在您的外部查询中添加一个 order by 子句,这将强制结果按您想要的顺序排列。当您在子查询中达到 TOP 5 By 逻辑时,它不会强制最终结果按希望排序。
  • 就是这样。我无法想到将 ORDER BY 放在外部查询上......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 2012-10-08
  • 1970-01-01
相关资源
最近更新 更多