mariadb 对于一个有8个日期列的表,如何按每行的最大日期对行进行排序?

cld4siwp  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(180)

这与SQL order by 2 date columns(或proper way to sort sql columns,只针对1列)有很大的不同。在这里,我们将执行如下操作:

ORDER BY CASE WHEN date_1 > date_2 
         THEN date_2 ELSE date_1 END

仅供参考,为了简洁起见,我在本例中使用了YYY-MM-DD,但我还需要它适用于TIMESTAMPYYYY-MM-DD HH:MI:SS
我有这张表:
| 标识符|姓名|日期_1|日期_2|日期_3|日期_4|日期_5|日期_6|日期_7|日期_8|
| - -|- -|- -|- -|- -|- -|- -|- -|- -|- -|
| 一个|若翰|2008年8月11日|2008年8月12日|2009年8月11日|2009年8月21日|2009年9月11日|2017年8月11日|2017年9月12日|2017年9月30日|
| 2个|比尔|2008年9月12日|2008年9月12日|2008年10月12日|2011年9月12日|2008年9月13日|2022年5月20日|2022年5月21日|2022年5月22日|
| 三个|安迪|2008年10月13日|2008年10月13日|2008年10月14日|2008年10月15日|2008年11月1日|2008年11月2日|2008年11月3日|2008年11月4日|
| 四个|汉克|2008年11月14日|2008年11月15日|2008年11月16日|2008年11月17日|2008年12月31日|2009年1月1日|2009年1月2日|2009年1月2日|
| 五个|亚历克斯|2008年12月15日|2018年12月15日|2018年12月15日|2018年12月16日|2018年12月17日|2018年12月18日|2018年12月25日|2008年12月31日|
......但是,这些排列组合让我头疼,光是想想它们。
X1 E2 F1 X有更多的“通用解决方案”,但那是对X1 M3 N1 X,而不是对X1 M4 N1 X...

SELECT MAX(date_col)
FROM(
  SELECT MAX(date_col1) AS date_col FROM some_table
  UNION
  SELECT MAX(date_col2) AS date_col FROM some_table
  UNION
  SELECT MAX(date_col3) AS date_col FROM some_table
  ...
)

有没有更像这样的东西,比如可以通过迭代一个循环来创建,比如PHP或Node.js?我需要一个 * 可伸缩 * 的解决方案。

  • 我只需要列出每个row一次。
  • 我想按我在row上列出的那些col中日期最近的那个来对它们进行排序。

类似于:

SELECT * FROM some_table WHERE
(
  GREATEST OF date_1
  OR date_2
  OR date_3
  OR date_4
  OR date_5
  OR date_6
  OR date_7
  OR date_8
)
ui7jx7zq

ui7jx7zq1#

您可以使用GREATEST函数来实现它。

SELECT  GREATEST(date_1,date_2,date_3,date_4,date_5,date_6,date_7,date_8) max_date,t.*
FROM Tab t
ORDER BY GREATEST(date_1,date_2,date_3,date_4,date_5,date_6,date_7,date_8) Desc;

DB小提琴:Try it here
| 最大日期|标识符|姓名|日期_1|日期_2|日期_3|日期_4|日期_5|日期_6|日期_7|日期_8|
| - -|- -|- -|- -|- -|- -|- -|- -|- -|- -|- -|
| 2022年5月22日|2个|比尔|2008年9月12日|2008年9月12日|2008年10月12日|2011年9月12日|2008年9月13日|2022年5月20日|2022年5月21日|2022年5月22日|
| 2018年12月25日|五个|亚历克斯|2008年12月15日|2018年12月15日|2018年12月15日|2018年12月16日|2018年12月17日|2018年12月18日|2018年12月25日|2008年12月31日|
| 2017年9月30日|一个|若翰|2008年8月11日|2008年8月12日|2009年8月11日|2009年8月21日|2009年9月11日|2017年8月11日|2017年9月12日|2017年9月30日|
| 2009年1月2日|四个|汉克|2008年11月14日|2008年11月15日|2008年11月16日|2008年11月17日|2008年12月31日|2009年1月1日|2009年1月2日|2009年1月2日|
| 2008年11月4日|三个|安迪|2008年10月13日|2008年10月13日|2008年10月14日|2008年10月15日|2008年11月1日|2008年11月2日|2008年11月3日|2008年11月4日|

wd2eg0qa

wd2eg0qa2#

NULL值的情况下,GREATEST可以丢弃ORDER
基于GREATEST处理NULL问题中的this Answer,根据已批准的答案,这将应用这些表:

SELECT COALESCE (
  GREATEST(date_1,date_2,date_3,date_4,date_5,date_6,date_7,date_8),
  date_1,date_2,date_3,date_4,date_5,date_6,date_7,date_8 
) max_date,t.*
FROM TAB t
ORDER BY COALESCE (
  GREATEST(date_1,date_2,date_3,date_4,date_5,date_6,date_7,date_8),
  date_1,date_2,date_3,date_4,date_5,date_6,date_7,date_8
) DESC;

相关问题