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

SQL Server,如何获得年轻用户?,sql,sql-server,Sql,Sql Server,我试图从一个较年轻的国家获得用户,例如,我有以下表格 如果有多个年龄最小的用户具有相同的年龄,则还应显示他们 谢谢您可以尝试此查询,在子查询上获取MIN生日,然后在用户表上获取自加入 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',c

我试图从一个较年轻的国家获得用户,例如,我有以下表格

如果有多个年龄最小的用户具有相同的年龄,则还应显示他们


谢谢

您可以尝试此查询,在子查询上获取
MIN
生日,然后在用户表上获取
自加入

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
SQLFIDLE:

使用窗口功能:

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

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

这有点棘手。我会使用窗口函数——数一数特定年龄段的人,然后选择那些年龄最小的重复的人

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

select u.*
from (select u.*,
             count(*) over (partition by idcountry, year(birthday)) as cnt_cb,
             rank() over (partition by idcountry order by year(birthday)) as rnk
      from users u
     ) u
where cnt_cb > 1 and rnk = 1;

我将让您处理连接以输入国家名称。

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

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;

请不要以图片形式发布您的表格。使用格式化文本。显示您尝试过的查询。您如何定义年龄?@gordon我想我们这里有语言障碍。根据这个例子,我认为OP想要最年轻的生日,所以最年长的人。@Bohemian。我并不是指最小的和最大的。年龄不必按完整年份计算,因此计算不精确。此查询使用出生年份而不是年龄。同一年出生的用户将有不同的年龄,这取决于月份和日期是在今天之前还是之后。最常见的情况是,年龄不仅仅是从他们出生的第一年开始计算的,还包括月份和日期。如果我的生日是今天,我会比昨天大一岁。@DanGuzman。我不一定只用年来计算年龄。OP的例子是两个出生在同一年的人的平局。OP应澄清定义。注意:如果OP在SQL Server中使用
datediff()
,则它与我使用的定义相同。