3

我有这样的桌子

  id     |     serial_num     |      version     | .....
  1      |         1          |          1       | .....
  2      |         2          |          1       | .....
  3      |         2          |          2       | .....
  4      |         3          |          1       | .....
  5      |         4          |          1       | .....
  6      |         5          |          1       | .....
  7      |         5          |          2       | .....
  8      |         5          |          3       | .....

现在我要选择的是获取具有最大版本和唯一 serialn_num 的行...

结果将是:

  id     |     serial_num     |      version     | .....
  1      |         1          |          1       | .....
  3      |         2          |          2       | .....
  4      |         3          |          1       | .....
  5      |         4          |          1       | .....
  8      |         5          |          3       | .....

我的 SQL 有点复杂,这就是为什么我不使用 MAX() 解决问题的原因......我几乎没有左连接等......

有任何想法吗?

最好的问候,并感谢您的宝贵时间!

4

3 回答 3

9

尝试这个:

SELECT yourtable.*
FROM yourtable
WHERE (serial_num, version) in (select serial_num, max(version)
                                from yourtable
                                group by serial_num)

子查询将返回 serial_num 的最大版本,因此这将返回 serial_num 具有最大值的所有行。看到这个小提琴

于 2013-01-04T15:18:18.353 回答
2

您可以使用子查询来查找最大值,然后加入您的表:

select t1.id,
  t1.serial_num,
  t1.version
from yourtable t1
inner join
(
  select serial_num, 
    max(version) version
  from yourtable
  group by serial_num
) t2
  on t1.serial_num = t2.serial_num
  and t1.version = t2.version

请参阅带有演示的 SQL Fiddle

结果:

| ID | SERIAL_NUM | VERSION |
-----------------------------
|  1 |          1 |       1 |
|  3 |          2 |       2 |
|  4 |          3 |       1 |
|  5 |          4 |       1 |
|  8 |          5 |       3 |
于 2013-01-04T15:19:40.587 回答
0

id通过查询选择组是没有用的。您应该只选择您在 group by 中使用的列以及正在应用聚合函数的其他列。

希望对你有用。

SELECT id, 
       serial_num, 
       Max(`version`) `version`
FROM   tbl1 
GROUP  BY serial_num 
于 2013-01-04T15:23:33.183 回答