首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL组的基本用法

SQL组的基本用法
EN

Stack Overflow用户
提问于 2017-05-27 14:17:37
回答 3查看 48关注 0票数 1

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

我有一张这样的桌子:

代码语言:javascript
复制
ID   Version
-------------
123  1
123  3
158  1
158  2
158  4

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

代码语言:javascript
复制
ID    Version
--------------
123   3
158   4

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

代码语言:javascript
复制
ID   Version   Value
----------------------
123  1         abc
123  3         xyz
158  1         pq
158  2         je
158  4         kju

我想要找回

代码语言:javascript
复制
ID   Version   Value
----------------------
123  3         xyz
158  4         kju

我无法得到如上面所示的值。这是否可以通过使用Group By

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-27 14:28:01

您可以使用SUBQUERY内部连接来解决这个问题。我不知道您的表名,但让我们称它们为VersionTable和VersionValueTable。所以我会这么做:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2017-05-27 14:28:13

您不使用group by进行此操作。最常见的方法是row_number()

代码语言:javascript
复制
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的是:

代码语言:javascript
复制
select t.*
from (select t.*,
             max(verson) over (partition by id) as max_version
      from t
     ) t
where version = max_version;
票数 1
EN

Stack Overflow用户

发布于 2017-05-27 22:20:31

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

代码语言:javascript
复制
SELECT * FROM MyTable t1
    WHERE t1.version = 
      (SELECT max(version) FROM MyTable t2 WHERE t2.id = t1.id)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44217921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档