Получение соответствующих значений строк в GROUP BY с помощью MIN

abney317 спросил: 13 октября 2017 в 07:50 в: mysql

У меня есть данные, которые выглядят примерно так:

+------------+---------+-------+
|    Name    |  Time   | Flag  |
+------------+---------+-------+
| Bob        | 401     | 1     |
| Bob        | 204     | 0     |
| Dan        | 402     | 1     |
| Dan        | 210     | 0     |
| Jeff       | 204     | 0     |
| Fred       | 407     | 1     |
| Mike       | 415     | 1     |
| Mike       | 238     | 0     |
+------------+---------+-------+

Я хочу получить лучшее время для каждого человека, но если установлен "флаг", его время должно быть разделено к 2. Например, лучшее время Боба будет 200,5

Теперь я могу сделать относительно простой запрос, чтобы получить эти данные следующим образом:

SELECT userid,
       MIN(CASE WHEN flag = 1 THEN time / 2 ELSE time END) AS convertedTime,
       time,
       flag
FROM   times t
GROUP  BY userid
ORDER  BY convertedtime ASC

Проблема вот что не возвращает правильные соответствующие данные для времени и флага, получая эти данные:

Bob     200.5   204     0

вместо правильных данных

Bob     200.5   401     1

Конечно, я вижу проблему с предыдущим запросом, и я исправил ее следующим образом:

 SELECT userid,
       MIN(convertedtime) AS convertedTime,
       (SELECT time
        FROM   times
        WHERE  MIN(convertedtime) = CASE
                                      WHEN flag = 1 THEN time / 2
                                      ELSE time
                                    end
        LIMIT  1)         AS time,
       (SELECT flag
        FROM   times
        WHERE  MIN(convertedtime) = CASE
                                      WHEN flag = 1 THEN time / 2
                                      ELSE time
                                    end
        LIMIT  1)         AS flag
FROM   (SELECT userid,
               CASE
                 WHEN flag = 1 THEN time / 2
                 ELSE time
               end AS convertedTime,
               time,
               flag
        FROM   times t) AS t
GROUP  BY userid
ORDER  BY convertedtime ASC

SQLFiddle

Это работает, но я чувствую, что должен быть лучший и более эффективный способ сделать это. В моем реальном запросе часть, где я делю время на 2, является гораздо более длинной формулой, и у меня есть тысячи строк, поэтому она очень медленная.

Так что вопрос в том, есть ли лучший / более эффективный запрос для этого?

0 ответов