我有大约15列的SQL表,但以下列很重要:
Id, Area, Action, Timestamp.
Area表示我的应用程序的实体(用户,文档等),Action代表用户做了什么(create, view, edit, cancel, etc...).
使用select语句我得到了这些数据,它代表了某种历史记录(用户在应用程序上做了什么)。如果我在同一区域执行相同的操作,则只有时间戳会区分它们(如果我们不考虑时间戳,则它们是重复的)。如何摆脱"重复"记录考虑所需列中的值(例如仅区域,操作)并仅采用最新的(按时间戳)?我使用DISTINCT
尝试了一些查询,但无法实现。
有一些"重复"如果我们只考虑Area,Action列,则记录。例如,区域为Notice
且操作为Details
的多个记录。最终结果应该是按时间戳(desc)排序的最后5条记录,并且根据(区域,动作)值不重复。
答案 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对子查询的回答。