имея список таких людей, как:
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
...
Спасибо!
Вот еще один способ, помимо ответа Гордона. Он использует соединения:
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;
На практике ваша таблица календаря будет хорошей таблицей, в которой будут указаны все даты, которые вы хотите отобразить в своем результирующем наборе.
Одним из методов является коррелированный подзапрос:
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;
Использовать 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;