我今天早些时候遇到了这个挑战。
将sQL查询写入:
使用date_added
保留每条记录的最新版本,但是
保留最早的this_flag
值。
只有[Name]
,[DOB]
和[ID]
用于确定记录的唯一性
CREATE TABLE [Table C](
[Date_added] [varchar](50) NULL,
[this_flag] [varchar](1) NULL,
[Name] [varchar](50) NULL,
[DOB] [int] NULL,
[ID] [int] NULL) ;
Date_added this_flag Name DOB ID
20150501 Y Jingleheimerscmidt 19901002 3
20150501 N Jingleheimerscmidt 19901002 3
20150505 Y Jon 19901001 1
20150501 N Jon 19901002 1
20150501 Y Jacob 19901001 2
20150505 N Jingleheimerscmidt 19901001 3
20150501 Y Jingleheimerscmidt 19901001 3
这就是我做的事情
SELECT * FROM Table_C where ID < 3;
我知道逻辑不正确。但所有其他语法只是为了 没削减它。 有谁知道如何为此编写正确的SQL查询?
答案 0 :(得分:1)
检查一下(假设你有SQL Server Version 2012或更高版本)
Tt使用Analytics功能First_Val获取最早的记录&#34; this_flag&#34;列和Rank函数根据添加日期的降序排名,以便最新日期始终以rank = 1
进行排序SELECT * from
(
Select * , FIRST_VALUE(this_flag) OVER (PArtition By Name, ID Order by Date_Added ) FirstVal_this_flag
, RANK() OVER ( PArtition By Name, ID Order by Date_Added desc ) as Rnk
from Table_C C
) a
Where Rnk = 1
编辑:示例中的前两行具有相同的 date_Added 值,并且 Pk也相同。也许这是您问题中的拼写错误但无论如何,下面的查询也将处理这种情况。在按Date_Added排序后,它只需要SQL引擎返回的第一个this_flag。
SELECT Distinct Date_Added , Name, DoB, ID, FirstVal_this_flag from
(
Select * , FIRST_VALUE(this_flag) OVER (PArtition By Name, DoB, ID Order by Date_Added ) FirstVal_this_flag
, RANK() OVER ( PArtition By Name, DoB, ID Order by Date_Added desc ) as Rnk
from Table_C C
) a
Where Rnk = 1