Transact SQL:仅当2列值相同时才进行最近的更改

时间:2016-12-05 17:17:23

标签: sql sql-server tsql

我正在尝试编写一个SQL请求,以便在我的数据库中获取用户,但这就是诀窍,如果有两次相同的电子邮件,我只想获取最新的一个(我的数据库中有时间戳)

这是SQL CODE

 SELECT cs_login, cs_email_opt_out_did 
 FROM dbo.individual 
 WHERE insert_date >= '2016-12-05 00:00:00' and insert_date < dateadd(day,1,'2016-12-05 23:59:59')

cs_login是我想检查重复的电子邮件地址 cs_email_opt_oud_did是一个布尔值,其值不重要 insert_date是我想要查看最新日期的时间戳

我的问题是我有2个电子邮件地址user@test.com,其值cs_email_opt_out_did不同。我不知道如何从insert_date列中选择具有最新日期值的那个

4 个答案:

答案 0 :(得分:1)

您可以在cte中使用row_number()函数:

with cte as (
  select 
      cs_login
    , cs_email_opt_out_did 
    , rn = row_number() over (partition by cs_login order by insert_date desc)
  from dbo.individual
  where insert_date >= '2016-12-05 00:00:00' 
    and insert_date < dateadd(day,1,'2016-12-05 23:59:59')
      )
select 
    cs_login
  , cs_email_opt_out_did
  from cte
  where rn = 1;

答案 1 :(得分:0)

使用SELECT i.cs_login, i.cs_email_opt_out_did FROM dbo.individual i INNER JOIN (SELECT cs_login, MAX(insert_date) dt FROM dbo.individual GROUP BY cs_login) as i2 ON i2.dt = i.insert_date and i2.cs_login = i.cs_login WHERE i.insert_date >= '2016-12-05 00:00:00' and i.insert_date < dateadd(day,1,'2016-12-05 23:59:59')

获取记录
{{1}}

答案 2 :(得分:0)

您可以使用排名窗口功能,例如DENSE_RANK

 SELECT cs_login, cs_email_opt_out_did  FROM (
 SELECT cs_login,cs_email_opt_out_did,insert_date, DENSE_RANK() OVER (PARTITION BY cs_login ORDER BY insert_date Desc) as [Rank]
 FROM dbo.individual 
 WHERE insert_date >= '2016-12-05 00:00:00' and insert_date < dateadd(day,1,'2016-12-05 23:59:59')) AS T1
 WHERE T1.[Rank] = 1

您还可以使用其他功能,例如RANKROW_NUMBER

答案 3 :(得分:0)

您也可以使用With Ties子句。不需要子查询或cte

#container{
  height: 200px;
  width: 300px;
  display: flex;
  flex-flow: column wrap;
}

#container, #A, #B, #C{
  box-sizing: border-box;
  border: 1px solid black;
}

#A{
  height: 50%;
  width: 100px;
}

#B{
  height: 50%;
  width: 100px;
}

#C{
  height: 100%;
  width: 200px;
}