Сортировка некоторых строк в среднем с помощью SQL - PullRequest
0 голосов
/ 14 июля 2011

Хорошо, так вот вызов для всех вас, профессионалов SQL: У меня есть таблица с двумя интересными колонками, группой и датой рождения. Только некоторым строкам назначена группа. Теперь я хочу напечатать все строки, отсортированные по дате рождения, но я также хочу, чтобы все строки в одной группе находились рядом друг с другом. Единственный полусмысленный способ сделать это - использовать средние даты рождения групп для всех строк в группе при сортировке. Вопрос в том, можно ли это сделать с помощью чистого SQL (в данном случае MySQL), или потребуется некоторая логика сценариев?

Для иллюстрации приведем таблицу:

id | group | birthdate
---+-------+-----------
1  | 1     | 1989-12-07
2  | NULL  | 1990-03-14
3  | 1     | 1987-05-25
4  | NULL  | 1985-09-29
5  | NULL  | 1988-11-11

и скажем, что "среднее" для 1987-05-25 и 1989-12-07 - это 1988-08-30 (это можно найти путем усреднения UNIX-эквивалентов дат по времени и последующей конвертации обратно в дату Это среднее не должно быть полностью правильным!). Выходные данные должны быть:

id | group | birthdate  | [sort_by_birthdate]
---+-------+------------+--------------------
4  | NULL  | 1985-09-29 | 1985-09-29
3  | 1     | 1987-05-25 | 1988-08-30
1  | 1     | 1989-12-07 | 1988-08-30
5  | NULL  | 1988-11-11 | 1988-11-11
2  | NULL  | 1990-03-14 | 1990-03-14

Есть идеи?

Cheers, Jon

1 Ответ

2 голосов
/ 14 июля 2011

Я обычно программирую на T-SQL, поэтому, пожалуйста, прости меня, если я не переведу функции даты идеально в MySQL:

SELECT
    T.id,
    T.group
FROM
    Some_Table T
LEFT OUTER JOIN (
    SELECT
        group,
        '1970-01-01' +
            INTERVAL AVG(DATEDIFF('1970-01-01', birthdate)) DAY AS avg_birthdate
    FROM
        Some_Table T2
    GROUP BY
        group
    ) SQ ON SQ.group = T.group
ORDER BY
    COALESCE(SQ.avg_birthdate, T.birthdate),
    T.group
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...