Стандартный SQL для замены GREATEST () в запросе MySQL - PullRequest
4 голосов
/ 28 октября 2011

У меня есть запрос MySQL, который использует функцию GREATEST(), и я хочу переписать его в стандартном ANSI SQL для запуска на других базах данных.Я знаю, что GREATEST поддерживается большинством баз данных SQL, но я, вероятно, собираюсь запустить запрос в 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

Ответы [ 2 ]

4 голосов
/ 28 октября 2011

Это не будет работать в MySQL, но проверяется как 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  
2 голосов
/ 28 октября 2011

Это должно сработать, хотя я не уверен, что вы могли бы назвать это «элегантным»:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...