仅在循环中显示最高的Alpha

时间:2018-09-01 17:50:48

标签: sql max mariadb

我只想在foreach循环中显示所有这些中的最大值。以下查询位于此foreach循环中。

SELECT MAX(substring_index(data_column, ' ', -1))
FROM table
WHERE id = '{id-from-the-loop}'
AND data_column != ''

查询给了我这个结果:

Data A
Data A
Data C
Data B
Data G
Data E

G是上面列表中的最高值,因此它将像下面的列表一样显示,但是我无法弄清楚!

Data
Data
Data
Data
Data G
Data

我该如何解决?

2 个答案:

答案 0 :(得分:0)

您可以尝试执行此操作,编写一个子查询以通过limit 1order by来获得它们的最高价值

然后使用具有outer join功能的自我coalesce

CREATE TABLE T(col varchar(50));

INSERT INTO T VALUES ('Data A');
INSERT INTO T VALUES ('Data A');
INSERT INTO T VALUES ('Data C');
INSERT INTO T VALUES ('Data B');
INSERT INTO T VALUES ('Data G');
INSERT INTO T VALUES ('Data E');

查询1

SELECT coalesce(t2.col,substring_index(t1.col, ' ', 1)) col
FROM T t1 LEFT JOIN (
   select col 
   from t
   order by col desc 
   limit 1
) t2 on t1.col =t2.col

Results

|    col |
|--------|
| Data G |
|   Data |
|   Data |
|   Data |
|   Data |
|   Data |

答案 1 :(得分:0)

自MariaDB 10.2.0起,您可以使用max()的窗口版本。检查CASE中字符串的第二部分是否为ID的最大值,如果是则返回完整的字符串。否则,只返回第一部分。

SELECT CASE substring_index(t1.data_column,
                            ' ',
                            -1)
         WHEN max(substring_index(t1.data_column,
                  ' ',
                  -1)) OVER (PARTITION BY id) THEN
           data_column
         ELSE
           substring_index(t1.data_column,
                          ' ',
                          1)
       END
       FROM elbat t1
       WHERE id = ?
             AND data_column <> '';

db<>fiddle

我不知道上下文是什么,但是如果可能的话,您不应使用这样的ID循环,而应生成完整的集合,然后对其进行迭代。这可能会快得多。假设您有要处理的ID列表,则可以使用IN并看起来像这样:

SELECT id,
       CASE substring_index(t1.data_column,
                            ' ',
                            -1)
         WHEN max(substring_index(t1.data_column,
                  ' ',
                  -1)) OVER (PARTITION BY id) THEN
           data_column
         ELSE
           substring_index(t1.data_column,
                          ' ',
                          1)
       END data
       FROM elbat t1
            WHERE id IN (?, ..., ?)
                  AND data_column <> '';