【问题标题】:Sorting some rows by average with SQL使用 SQL 对某些行进行平均排序
【发布时间】:2011-10-05 13:50:06
【问题描述】:

好的,下面是对所有 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

有什么想法吗?

干杯, 乔恩

【问题讨论】:

  • 那么您想按同一组中生日的平均值排序吗?如果您的示例中某人的生日为1988-08-30,我不确定您的订单是否会保留
  • 我希望拥有1988-08-30 的人会在组之前或之后...我意识到这对于纯 SQL 来说是一件棘手的事情,但我想我会问以防万一=)
  • 你不能只按组排序,生日吗?
  • 不,这是行不通的,因为我希望按出生日期与其他结果半排序,而不是自己结束

标签: mysql sql sorting grouping


【解决方案1】:

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

【讨论】:

  • 你能解释一下MIN(birthdate) + INTERVAL AVG(DATEDIFF('1970-01-01', birthdate)) 是什么意思
  • 我不了解 MySQL,但您无法在 MS SQL 中的一堆日期上获得 AVG。该行获取所有生日在 1970 年之后的平均天数,然后将它们相加。我刚刚意识到我应该将它们添加到 1970 而不是 MIN,所以我会更正它。
  • #Tom 好吧,现在 MIN(Birthdate) 对我来说毫无意义。
  • 我开始以一种方式编写查询,然后改变了主意,但只修复了其中的一部分。感谢收看。
  • 可能最终会使用 FROM_UNIXTIME(AVG(UNIX_TIMESTAMP(birthdate))) 而不是 1970 + AVG 稍微修改一下,但除此之外是一个完美的解决方案!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多