SQL получает максимум столбцов, где строка равна чему-то - PullRequest
0 голосов
/ 09 ноября 2018

Если у меня есть таблица с 3 столбцами:

Date | Name  | Num
oct1 | Bob   | 2
oct2 | Zayne | 1   
oct1 | Test  | 5    
oct2 | Apple | 7

Я хочу получить строки, где Num равно MAX,

WHERE Date = oct1 or Date = oct2

Итак, я хочу, чтобы результат был:

oct1 Test 5
oct2 Apple 7

MYSQL является предпочтительным. Но ответ на SQL также будет дан. Спасибо.

Ответы [ 5 ]

0 голосов
/ 09 ноября 2018

Как и вы, когда просите стандартный способ сделать это: все ответы, приведенные до сих пор, соответствуют стандарту SQL. Еще один возможный подход в стандартном SQL - использовать оконную функцию. Однако это доступно только в MySQL начиная с версии 8.

select date, name, num
from
(
  select date, name, num, max(num) over (partition by date) as max_num
  from mytable
) analyzed
where num = maxnum
order by date;

Это читает таблицу только один раз, что может (но не обязательно) ускорить запрос.

0 голосов
/ 09 ноября 2018

Вы можете использовать коррелированный подзапрос, как показано ниже

 SELECT *
 FROM T t1
 WHERE Num = (SELECT MAX(Num) FROM T t2 WHERE t2.Date = t1.Date)

Скриптовая ссылка

Date    Name    Num
oct1    Test    5
oct2    Apple   7
0 голосов
/ 09 ноября 2018

Вы можете попробовать ниже, используя коррелированный подзапрос

select * from tablename a 
 where num in (select max(num) from tablename b where a.date=b.date)
 and date in ('oct1', 'oct2')
0 голосов
/ 09 ноября 2018

Похоже, вы хотите этот запрос:

SELECT t1.*
FROM yourTable t1
INNER JOIN
(
    SELECT Date, MAX(Num) AS max_num
    FROM yourTable
    WHERE Date IN ('oct1', 'oct2')
    GROUP BY Date
) t2
    ON t1.Date = t2.Date AND t1.Num = t2.max_num
WHERE t1.Date IN ('oct1', 'oct2');

Кстати, вы должны серьезно рассмотреть вопрос о сохранении правильных данных о дате в столбце фактической даты или даты и времени в MySQL. Похоже, вы сейчас просто храните текст, с которым было бы трудно работать.

0 голосов
/ 09 ноября 2018

Вы можете попробовать правильно использовать подзапрос

Схема (MySQL v5.7)

CREATE TABLE T(
   Date VARCHAR(50),
   Name  VARCHAR(50), 
  Num INT
);



INSERT INTO T VALUES ('oct1','Bob',2);
INSERT INTO T VALUES ('oct2','Zayne',1);
INSERT INTO T VALUES ('oct1','Test',5);
INSERT INTO T VALUES ('oct2','Apple',7);

Запрос № 1

SELECT *
FROM T t1
WHERE Num = (SELECT MAX(Num) FROM T tt WHERE t1.Date = tt.Date)
AND 
     t1.Date in ('oct1','oct2')


| Date | Name  | Num |
| ---- | ----- | --- |
| oct1 | Test  | 5   |
| oct2 | Apple | 7   |

Просмотр на БД Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...