Выберите, сколько строк до даты

0

имея список таких людей, как:

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
...

Спасибо!

  • 0
    У OP также, кажется, есть даты континуума в результате, которых нет в таблице
Теги:

3 ответа

4
Лучший ответ

Вот еще один способ, помимо ответа Гордона. Он использует соединения:

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;

Изображение 174551

демонстрация

На практике ваша таблица календаря будет хорошей таблицей, в которой будут указаны все даты, которые вы хотите отобразить в своем результирующем наборе.

4

Одним из методов является коррелированный подзапрос:

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;
0

Использовать 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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню