【问题标题】:Standard SQL to replace GREATEST() in MySQL query在 MySQL 查询中替换 GREATEST() 的标准 SQL
【发布时间】:2011-10-28 12:11:37
【问题描述】:

我有一个使用 GREATEST() 函数的 MySQL 查询,我想用标准 ANSI SQL 重写它以在其他数据库上运行。我知道大多数 SQL 数据库都支持 GREATEST,但我可能会在 Hive 中运行查询,它支持 CASE 之类的东西,但不支持 GREATEST。

谁能想到一个优雅的方法来重写这个查询而不使用GREATEST()

谢谢!

select 
greatest(play,play_25,play_50,play_75,play_100) as play,
greatest(play_25,play_50,play_75,play_100) as play_25,
greatest(play_50,play_75,play_100) as play_50,
greatest(play_75,play_100) as play_75,
play_100 as play_100 
from video_buckets

【问题讨论】:

标签: mysql sql hive


【解决方案1】:

这在 MySQL 中不起作用,但 validates as Full SQL-92

SELECT (SELECT MAX(c)
        FROM   (VALUES(play),
                      (play_25),
                      (play_50),
                      (play_75),
                      (play_100)) T (c))  AS play,
       (SELECT MAX(c)
        FROM   (VALUES (play_25),
                       (play_50),
                       (play_75),
                       (play_100)) T (c)) AS play_25
FROM   video_buckets  

【讨论】:

  • 你的other idea 怎么样,可以在 MySQL 中工作吗?
  • @AndriyM - 不。MySQL 不支持对派生表中外部查询的列的这些引用。 AFAIK 派生表需要在整个查询中保持静态。
  • 我猜这不适用于 MySQL。也许值得尝试使用 UNION 重写它。
  • @Karolis - 我之前尝试过,但 MySQL 仍然不喜欢它!此外,FROM 的每一位都需要一个 FROM 子句来验证为标准 SQL。
【解决方案2】:

这应该可以,虽然我不确定你是否可以称它为“优雅”:

SELECT
  CASE WHEN play_25 > play THEN play_25 ELSE play END AS play,
  play_25,
  play_50,
  play_75,
  play_100
FROM (
  SELECT
    play,
    CASE WHEN play_50 > play_25 THEN play_50 ELSE play_25 END AS play_25,
    play_50,
    play_75,
    play_100
  FROM (
    SELECT
      play,
      play_25,
      CASE WHEN play_75 > play_50 THEN play_75 ELSE play_50 END AS play_50,
      play_75,
      play_100
    FROM (
      SELECT
        play,
        play_25,
        play_50,
        CASE WHEN play_100 > play_75 THEN play_100 ELSE play_75 END AS play_75,
        play_100
      FROM video_buckets
    ) s
  ) s
) s

【讨论】:

  • 我认为它对我的目的来说已经足够优雅了,应该可以在 Hive 中使用。谢谢!
猜你喜欢
  • 2011-04-17
  • 2013-07-13
  • 2020-03-14
  • 2020-05-11
  • 2013-06-07
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
相关资源
最近更新 更多