选择一个日期的行数

gzszwxb4  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(462)

有这样的人的名单:

name      date_of_birth
john      1987-09-08
maria     1987-09-08
samuel    1987-09-09
claire    1987-09-10
jane      1987-09-10
rose      1987-09-12
...

如何使用sql获取截至该日期有多少人出生的结果视图,如该表的输出应为:

date        count
1987-09-08  2
1987-09-09  3
1987-09-10  5
1987-09-11  5
1987-09-12  6
...

谢谢!

tkclm6bt

tkclm6bt1#

除了戈登的答案,还有另一种方法。它使用连接:

SELECT
    t1.date_of_birth,
    COUNT(*) AS count
FROM (SELECT DISTINCT date_of_birth FROM yourTable) t1
INNER JOIN yourTable t2
    ON t1.date_of_birth >= t2.date_of_birth
GROUP BY
    t1.date_of_birth;

注意:我遗漏了一个步骤。显然,你还想报告错过的日期。如果是这样,那么你可以替换我的别名 t1 有一张日历桌。为了演示,您可以内联所有日期:

SELECT
    t1.date_of_birth,
    COUNT(*) AS count
FROM
(
    SELECT '1987-09-08' AS date_of_birth UNION ALL
    SELECT '1987-09-09' UNION ALL
    SELECT '1987-09-10' UNION ALL
    SELECT '1987-09-11' UNION ALL
    SELECT '1987-09-12'
) t1
LEFT JOIN yourTable t2
    ON t1.date_of_birth >= t2.date_of_birth
GROUP BY
    t1.date_of_birth;

演示

实际上,您的日历表将是一个真正的表,它只包含您希望显示在结果集中的所有日期。

ufj5ltwl

ufj5ltwl2#

一种方法是相关子查询:

select dob.date_of_birth,
       (select count(*) from t where t.date_of_birth <= dob.date_of_birth) as running_count
from (select distinct date_of_birth from t) dob;

这不是特别有效。如果您的数据有任何大小,则变量更好(如果您使用的是mysql 8.0,则使用窗口函数):

select date_of_birth,
       (@x := @x + cnt) as running_count
from (select date_of_birth, count(*) as cnt
      from t
      group by date_of_birth
      order by date_of_birth
     ) dob cross join
     (select @x := 0) params;
piok6c0g

piok6c0g3#

使用 subquery 采用相关法:

select date_of_birth, (select count(*)
                       from table
                       where date_of_birth <= t.date_of_birth
                       ) as count
from table t
group by date_of_birth;

相关问题