我正在尝试编写一个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
列中选择具有最新日期值的那个
答案 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
您还可以使用其他功能,例如RANK和ROW_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;
}