SQL Server,如何获得年轻用户?

时间:2018-06-09 21:15:32

标签: sql sql-server

我试图从年轻的国家/地区获取用户,例如我有以下表格。

Users table

enter image description here

如果年龄相同且年龄相同的用户不止一个,也应该显示

enter image description here

由于

4 个答案:

答案 0 :(得分:0)

您可以尝试此查询,在子查询上获得MIN生日,然后在用户表上获取self join

select u.idcountry,t.name,u.username, (DATEPART(year, getdate()) - t.years) 'age'
from 
(
SELECT u.idcountry,c.name,DATEPART(year, u.birthday) as 'years',count(*) as 'cnt'
FROM users u inner join country c on u.idcountry = c.idcountry
group by u.idcountry,c.name,DATEPART(year, u.birthday)
) t inner join users u on t.idcountry = u.idcountry and t.years = DATEPART(year, u.birthday)
where t.cnt > 1

sqlfiddle:https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=9baab959f79b1fa8c28ed87a8640e85d

答案 1 :(得分:0)

使用rank()窗口功能:

select ...
from ...
where rank() over (partition by idcountry order by birthday) = 1

在一个国家/地区中具有相同生日的行的排名相同,因此如果有多个人,则会返回所有最年轻的人。

答案 2 :(得分:0)

这有点棘手。我会使用窗口函数 - 计算特定年龄的人,并选择那些最年轻的人。

您没有指定如何定义年龄,因此我将使用最早的日历年:

WebDriverException: Message: Can't load the profile. Possible firefox version mismatch. You must use GeckoDriver instead for Firefox 48+. Profile Dir: /var/folders/yl/nmd8mk3102vd3c003pbfnvs1tfpjn2/T/tmpm66g_w_2 If you specified a log_file in the FirefoxBinary constructor, check it for details.

我会让你处理联接以引入国名。

答案 3 :(得分:0)

您的样本数据和所需结果会显示每个国家/地区中年龄最大的用户,其中一个以上的老年人具有相同的年龄。假设年龄是使用完整出生日期计算的,下面的查询将会这样做。

WITH
    users AS (
        SELECT 
              username
            , birthday
            , idcountry
            , (CAST(CONVERT(char(8),GETDATE(),112) AS int) - CAST(CONVERT(char(8),birthday,112) AS int)) / 10000 AS age
            , RANK() OVER(PARTITION BY idcountry ORDER BY (CAST(CONVERT(char(8),GETDATE(),112) AS int) - CAST(CONVERT(char(8),birthday,112) AS int)) / 10000 DESC) AS age_rank
        FROM dbo.Users
    )
    , oldest_users AS (
        SELECT
              username
            , birthday
            , idcountry
            , age
            , COUNT(*) OVER(PARTITION BY idcountry, age_rank ORDER BY age_rank) AS age_count
        FROM users
        WHERE age_rank = 1
    )
SELECT
      c.idcountry
    , c.name
    , oldest_users.age
    , oldest_users.username
FROM oldest_users
JOIN dbo.Country AS c ON c.idcountry = oldest_users.idcountry
WHERE
    oldest_users.age_count > 1;