【问题标题】:SQL Query to find the most recent group of recordsSQL 查询以查找最近的记录组
【发布时间】:2013-10-21 21:30:11
【问题描述】:

我有共享 IdString 的记录历史记录(每次更新的多条记录都具有完全相同的日期时间)。

我想要一个查询来确定这些记录中的哪些是最近更新组的一部分。

此查询将向我显示 一个 具有最近更新日期的记录,但 对于每个分区,我需要具有该最大日期的所有记录。 p>

;with cte as(
select ROW_NUMBER() over (partition by IdString order by UpdateDate desc) as [rn], *
from MyTable
)
select  CASE WHEN (cte.rn = 1) THEN 0 ELSE 1 END [IsOld], *
from MyTable m
inner join cte on cte.RecordId= m.RecordId

有人可以帮我找出一个合适的查询吗?

编辑:示例

(IsOld is the desired calculated value)

IsOld RecordId  IdString  UpdateDate
1         1     ABC 2011-06-16 
1         2     ABC 2012-05-30 
1         3     ABC 2008-12-31 
0         4     ABC 2012-06-08 
1         5     ABC 2011-01-16 
0         6     ABC 2012-06-08 
1         7     ABC 2012-06-07 
1         8     XYZ 2001-01-16
1         9     XYZ 2013-01-30
0         10    XYZ 2001-01-31
1         11    XYZ 2013-06-01
1         12    XYZ 2001-05-04
0         13    XYZ 2013-01-30

【问题讨论】:

  • 你能提供一些测试数据和想要的结果吗?
  • 根据新的样本数据检查我的更新答案。

标签: sql sql-server tsql


【解决方案1】:
SELECT CASE WHEN updateDate = maxDate THEN 0 ELSE 1 END isOldRecord, RecordID, IDString, UpdateDate
FROM 
(
select  m.RecordID, m.IDString, m.updateDate, MAX(UpdateDate) OVER (PARTITION BY IDString) maxDate
    from MyTable m
) A

【讨论】:

  • 这个解决方案很好地完成了这项工作。非常感谢您的帮助,并首先回答,但我更喜欢 RANK() 查询。
【解决方案2】:

试试这个 -

;WITH cte AS(
    SELECT RANK() OVER(PARTITION BY IdString ORDER BY UpdateDate DESC) AS [row_num], *
    FROM   MyTable
)
SELECT CASE WHEN m.[row_num] = 1 THEN 0 ELSE 1 END isOld, *
from cte m

【讨论】:

  • Rank() 正是我想要的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 2018-07-09
  • 2022-01-16
相关资源
最近更新 更多