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