sql获取行等于某物的最大列数

sxpgvts3  于 2021-06-18  发布在  Mysql
关注(0)|答案(5)|浏览(276)

如果有三列表:

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

我想找回 NumMAX ,

WHERE Date = oct1 or Date = oct2

所以我希望结果是:

oct1 Test 5
oct2 Apple 7

首选mysql。但也必须给出答案。谢谢。

4ktjp1zp

4ktjp1zp1#

当你要求一个标准的方法来做到这一点时:所有给出的答案都符合sql标准。标准sql中还有一种可能的方法是使用window函数。然而,从版本8开始,mysql中只提供了这一功能。

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;

这只读取一次表,这可以(但不一定)加快查询速度。

ej83mcc0

ej83mcc02#

您可以在下面尝试使用相关子查询

select * from tablename a 
 where num in (select max(num) from tablename b where a.date=b.date)
 and date in ('oct1', 'oct2')
oxf4rvwz

oxf4rvwz3#

听起来你想要这个查询:

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的实际日期或日期时间列中存储适当的日期数据。似乎您现在只是在存储文本,这将很难处理。

6ss1mwsb

6ss1mwsb4#

您可以尝试正确使用子查询
架构(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   |

db fiddle视图

bttbmeg0

bttbmeg05#

您可以使用如下所示的相关子查询

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

相关问题