【问题标题】:SQL: Creating ordinal columns from return setSQL:从返回集创建序数列
【发布时间】:2014-08-28 21:23:40
【问题描述】:

我有一个 MySQL 表格...

record    timestamp
1         2014-07-10
2         2014-07-10
1         2014-07-11
2         2014-07-11
1         2014-07-12
2         2014-07-12

...我想以返回一组表单的方式查询它...

record    1st time    2nd time    3rd time
1         2014-07-10  2014-07-11  2014-07-12
2         2014-07-10  2014-07-11  2014-07-12
...

我很乐意使用MAX() 和子查询来获得最近的时间戳,但这似乎更适合返回可迭代的 SQL 对象。例如,如果我可以使用类似...

SELECT record, timestamp[0] AS "1st time", timestamp[1] AS "2nd time", timestamp[2] AS "3rd time"

...那太好了。这是PIVOT() 可以用来做什么吗?

【问题讨论】:

  • 将表加入自身 3 次。杂乱无章,但 SQL 形状不是动态的(必须使用动态查询生成或外部代码来处理 N)。如果一个字符串可以被返回/处理 MySQL doesgroup_concat.

标签: mysql ordinal


【解决方案1】:

对于上述限制为 3 列的数据集,您可以执行以下操作

SELECT t1.record,
MAX(CASE WHEN t1.rownum = 1 THEN t1.timestamp  END) AS `1st time`,
MAX(CASE WHEN t1.rownum = 2 THEN t1.timestamp  END) AS `2nd time`,
MAX(CASE WHEN t1.rownum = 3 THEN t1.timestamp  END) AS `3rd time`
FROM (
  SELECT t.*,
  @r:= CASE WHEN @g= record THEN @r + 1 ELSE 1 END rownum,
  @g:=record
  FROM table t
  CROSS JOIN (SELECT @g:=0,@r:=0) t1
  ORDER BY `record`, `timestamp`
  ) t1
GROUP BY t1.record

Demo

【讨论】:

  • 谢谢。不幸的是,我不知道任何条目的位置,需要通过比较来推断。例如,我目前使用MAX(t.timestamp)ORDER BY t.timestamp DESC 来返回最近的时间戳。我试图将其推广到第二、第三等位置。
  • @DanielBlack 不,这不是 mysql 的工作方式,作为标准应该有一个定义的编号。查询中的列,但是如果您需要枢轴,那么动态枢轴查询有一些解决方法,但是在动态 sql 中使用 group_concat 及其长度也是有限制的,对于您所说的 max 和 order 的部分,是的,您可以使用您的查询为select MAX(t.timestamp) times,record from table group by record order by times desc limit 1 为最高,为第二高更改限制到限制1,1 为第三个最高限制2,1 依此类推,但您必须再次提供限制数量的值
  • 查询将具有已定义的列数。为了易读性,我试图简化。我将返回给定状态的记录和最近的、第二最近的、...、第 90 个最近的时间戳。我的印象是我最好只为移动的 90 天窗口提取所有时间戳并在 Excel 中进行排序。即使我可以让查询完成工作,除非我将其设为视图或存储过程,否则它会非常繁重。
  • @DanielBlack 我建议不要使用动态查询执行此操作,我可以使用 answered here 的动态复制上述解决方案,但这不是最佳解决方案,无法优化解决方案以获得更好的性能最好在您的应用程序级别代码或其他方面实现此类 90th most-recent timestamp 要求,希望我已经为您清楚地了解了
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 2019-01-27
  • 2023-04-08
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 2012-05-23
相关资源
最近更新 更多