SQL组的基本用法

时间:2017-05-27 14:17:37

标签: sql sql-server group-by

一个非常基本的问题,如果可以在SQL Server中使用Group by来完成。

我有一张这样的表:

ID   Version
-------------
123  1
123  3
158  1
158  2
158  4

使用Group By ID, max(Version)我得

ID    Version
--------------
123   3
158   4

我有一个包含另一列value的扩展表,这是有趣的数据:

ID   Version   Value
----------------------
123  1         abc
123  3         xyz
158  1         pq
158  2         je
158  4         kju

我想要检索

ID   Version   Value
----------------------
123  3         xyz
158  4         kju

我无法获得如上所示的值。这可以通过Group By使用吗?

3 个答案:

答案 0 :(得分:2)

您可以使用带有SUBQUERY的INNER JOIN来解决这个问题。我不知道你的表名,但我们称之为VersionTable和VersionValueTable。所以我会这样做:

SELECT vt.ID, vt.Version, vvt.Value
FROM VersionValueTable vvt
   INNER JOIN (SELECT ID, MAX(Version)
               FROM VERSION
               GROUP BY ID) vt ON vt.ID = vvt.ID AND vt.Version = vvt.Version

答案 1 :(得分:1)

您不要使用group by。最常见的方法是row_number()

select t.*
from (select t.*,
             row_number() over (partition by id order by version desc) as seqnum
      from t
     ) t
where seqnum = 1;

还有很多其他方法可以做到这一点。如果您正在学习窗口函数,则最接近group by的是:

select t.*
from (select t.*,
             max(verson) over (partition by id) as max_version
      from t
     ) t
where version = max_version;

答案 2 :(得分:0)

您可以将行的版本与属于每个行ID的Max-version进行比较。 使用子查询,您可以找到具有相同ID的行的子集,并获取Version字段的最大值。正如您在以下代码中看到的那样:

SELECT * FROM MyTable t1
    WHERE t1.version = 
      (SELECT max(version) FROM MyTable t2 WHERE t2.id = t1.id)

要查找与主Select查询中当前行具有相同ID的记录子集,可以使用whereclause(WHERE t2.id = t1.id),其中t1是主查询中的表的别名, t2是子查询中表的别名。