SQL组的基本用法

SQL组的基本用法,sql,sql-server,group-by,Sql,Sql Server,Group By,一个非常基本的问题是,是否可以使用SQL Server中的分组方式来完成此操作 我有一张这样的桌子: ID Version ------------- 123 1 123 3 158 1 158 2 158 4 使用按ID分组,最大值(版本)我得到 ID Version -------------- 123 3 158 4 我有一个扩展表,其中包含另一列值,这是有趣的数据: ID Version Value ---------------------- 1

一个非常基本的问题是,是否可以使用SQL Server中的
分组方式来完成此操作

我有一张这样的桌子:

ID   Version
-------------
123  1
123  3
158  1
158  2
158  4
使用
按ID分组,最大值(版本)
我得到

ID    Version
--------------
123   3
158   4
我有一个扩展表,其中包含另一列
,这是有趣的数据:

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

我无法获得如上所示的值。这是否可以通过使用
分组依据
来实现?

您可以通过子查询的内部联接来解决这一问题。我不知道您的表名,但让我们称它们为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

您不能为此使用
分组依据。最常见的方法是
行编号()

还有无数其他方法可以做到这一点。如果您正在学习窗口功能,最接近分组依据的是:

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

您可以将行的版本与属于每个行ID的最大版本进行比较。 通过子查询,您可以找到具有相同ID的行的子集,并获得版本字段的最大值。正如您在以下代码中看到的:

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

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

虽然此代码可以回答此问题,提供关于如何和/或为什么解决问题的附加上下文将提高答案的长期价值。
SELECT * FROM MyTable t1
    WHERE t1.version = 
      (SELECT max(version) FROM MyTable t2 WHERE t2.id = t1.id)