使用SQL对某些行进行平均排序

时间:2011-07-14 17:49:44

标签: mysql sql sorting grouping

好的,所以这对所有SQL专业人员来说都是一个挑战: 我有一张桌子,里面有两列感兴趣的小组和生日。只有一些行具有分配给它们的组。 我现在想打印所有按birthdate排序的行,但我也希望所有具有相同组的行最终彼此相邻。这样做的唯一半合理方式是在排序时将组的平均出生日期用于组中的所有行。问题是,这可以用纯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

有什么想法吗?

干杯, 乔恩

1 个答案:

答案 0 :(得分:2)

我通常使用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