这是我试图尝试的随机技能问题
Create Table Customer(
ID Int Not Null
,Name Varchar(20)
,Email Nvarchar(100)
,DOB Datetime)
--10,000,000 records inserted
QUES。根据日期(不包括时间)从该表中找到第三个最年轻的客户。
如果有多个客户在第三位有相同的DOB, 然后只应返回按名称字母顺序排列的那个。
E.g。如果下面有3个客户在第3位有相同的DOB, 然后只返回一个名为Alanso的记录。
Name DOB
Peter 1980/1/1
Mark 1980/1/1
Alanso 1980/1/1
答案 0 :(得分:3)
with rnk as (
select Name,
dense_rank() over (order by DOB desc) as dr,
row_number() over (partition by DOB order by Name) as rn
from Customer
)
select Name from rnk
where dr = 3 and rn = 1;
经典我们做过这样的事情:
select Name from Customer c
where
(
select count(distinct DOB) from Customer c2
where c2.DOB <= c.DOB
) = 3
and
(
select count(*) from Customer c2
where c2.DOB = c.DOB and c2.Name <= c.Name
) = 1;
答案 1 :(得分:2)
一种方法是两次应用分析函数。首先,我们可以在您的桌子上应用DENSE_RANK
,按出生日期的日期部分排序,以识别与第三年龄相关的所有记录。然后,我们可以对该结果进行子查询,并使用ROW_NUMBER
按名称升序排序,以查找要保留的记录。
SELECT
ID, NAME, EMAIL, DOB
FROM
(
SELECT *, ROW_NUMBER() OVER (ORDER BY NAME) rn
FROM
(
SELECT *,
DENSE_RANK() OVER (ORDER BY CONVERT(DATE, DOB)) dr
FROM yourTable
) t
WHERE dr = 3
) t
WHERE rn = 1;