繁体   English   中英

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

[英]Sorting some rows by average with SQL

好吧,这对你们所有人来说都是一个挑战 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 时间戳等效值然后转换回日期来找到。这个平均值不必完全正确。):output 应该是:

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

有任何想法吗?

干杯,乔恩

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM