SQL - 选择查询/删除所需列中具有重复值的记录

时间:2017-10-31 15:48:33

标签: sql select duplicates

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

Id, Area, Action, Timestamp.

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

编辑:这是MSSQL。 我的初始查询就像(只有几个重要的列,考虑到有更多的列): enter image description here

有一些"重复"如果我们只考虑Area,Action列,则记录。例如,区域为Notice且操作为Details的多个记录。最终结果应该是按时间戳(desc)排序的最后5条记录,并且根据(区域,动作)值不重复。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

以下查询将返回您所追求的结果。使用子查询检索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对子查询的回答。