如果所有客户都拥有相同的DOB,则选择Top 3然后选择按字母顺序排列的高客户

时间:2018-02-14 16:34:21

标签: sql sql-server-2014

这是我试图尝试的随机技能问题

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 

2 个答案:

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