Выберите, сколько строк до даты - PullRequest
0 голосов
/ 24 мая 2018

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

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

Спасибо!

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Использование 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;
0 голосов
/ 24 мая 2018

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

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;

enter image description here

Демо

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

0 голосов
/ 24 мая 2018

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

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...