SQL-简单但棘手的查询挑战

时间:2016-07-23 03:54:36

标签: sql sql-server join

我今天早些时候遇到了这个挑战。

将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查询?

1 个答案:

答案 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