繁体   English   中英

在SQL的一列中选择具有最高值的行

[英]Select rows with highest value in one column in SQL

在MySQL中,我试图为每个“ foreign_id”选择一行。 它必须是“时间”列(其类型为DATETIME)中具有最高值的行。 您能帮我看看SQL SELECT语句的外观如何吗? 谢谢! 这真是太好了! 我已经尝试了几个小时才能找到解决方案:(

这是我的桌子:

primary_id | foreign_id | name | time
----------------------------------------------------
1          | 3          | a    | 2017-05-18 01:02:03
2          | 3          | b    | 2017-05-19 01:02:03
3          | 3          | c    | 2017-05-20 01:02:03
4          | 5          | d    | 2017-07-18 01:02:03
5          | 5          | e    | 2017-07-20 01:02:03
6          | 5          | f    | 2017-07-18 01:02:03

结果如下所示:

primary_id | foreign_id | name | time
----------------------------------------------------
3          | 3          | c    | 2017-05-20 01:02:03
5          | 5          | e    | 2017-07-20 01:02:03

我试图按时间排序中间结果(降序),然后使用LIMIT 1仅选择第一行。但是像这样,我无法为每个foreign_id获得一行。

另一种尝试是先按时间顺序排列中间结果(降序),然后再按GROUP BY foreign_id。 但是GROUP BY语句似乎是 ORDER BY语句之前执行的(因此我收到了primary_id为1和4的行,而不是3和5的行)。

尝试这个

SELECT DISTINCT *
From my_table A
INNER JOIN (SELECT foreign_id, Max(time) AS time FROM my_table GROUP BY foreign_id) B
ON A.foreign_id = B.foreign_id AND A.time = B.time

只需添加一些数据样本来分析特殊情况

CREATE TABLE Table1
    (`primary_id` int, `foreign_id` int, `name` varchar(1), `time` datetime)
;

INSERT INTO Table1
    (`primary_id`, `foreign_id`, `name`, `time`)
VALUES
    (1, 3, 'a', '2017-05-18 01:02:03'),
    (2, 3, 'b', '2017-05-19 01:02:03'),
    (3, 3, 'c', '2017-05-20 01:02:03'),
 (7, 3, 'H', '2017-05-20 01:02:03'),
    (4, 5, 'd', '2017-07-18 01:02:03'),
    (5, 5, 'e', '2017-07-20 01:02:03'),
    (6, 5, 'f', '2017-07-18 01:02:03')
;

http://sqlfiddle.com/#!9/38947b/6

select d.primary_id, d.foreign_id, c.name, d.time
from table1 c inner join (    
select max(b.primary_id) primary_id, a.foreign_id,   a.time  
 from table1 b inner join 
 ( select  foreign_id, max(time) time
from table1
group by foreign_id) a
on a.foreign_id = b.foreign_id and a.time=b.time
group by   a.foreign_id,  a.time  ) d
on c.primary_id=d.primary_id

在过去的日子里,您会将其编码为相关子查询:SELECT * FROM Table1 o WHERE primary_id =(SELECT min(m.primary_id)FROM Table1 m WHERE m.time =(SELECT max(i.time)FROM Table1 i在哪里o .foreign_id = i.foreign_id))

额外的子查询处理重复的foreign_id和时间值的情况。 如果确定每个foreign_id的时间都是唯一的,则可以省略中间子查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM