从表 SQL 中选择多个不同的行

Posted

技术标签:

【中文标题】从表 SQL 中选择多个不同的行【英文标题】:Select multiple distinct rows from table SQL 【发布时间】:2013-03-29 19:41:17 【问题描述】:

我正在尝试从我的数据库中的表中选择不同的(上次更新的)行。我正在尝试获取每个“子部分”的最后更新行。但是我找不到实现这一目标的方法。

表格如下:

ID    | Name   |LastUpdated                  | Section    | Sub    |

1     | Name1  | 2013-04-07 16:38:18.837     | 1          | 1      |
2     | Name2  | 2013-04-07 15:38:18.837     | 1          | 2      |
3     | Name3  | 2013-04-07 12:38:18.837     | 1          | 1      |
4     | Name4  | 2013-04-07 13:38:18.837     | 1          | 3      |
5     | Name5  | 2013-04-07 17:38:18.837     | 1          | 3      |

我想让我的 SQL 语句做的是返回行:

1、2 和 5。

它们对于 Sub 是不同的,并且是最新的。

我试过了:

SELECT DISTINCT Sub, LastUpdated, Name 
FROM TABLE 
WHERE LastUpdated = (SELECT MAX(LastUpdated) FROM TABLE WHERE Section = 1)

仅返回最近更新行的不同行。这是有道理的。

我已经用谷歌搜索了我正在尝试的内容,并在此处查看了相关帖子。但是没有设法找到一个真正回答我正在尝试的问题。

【问题讨论】:

【参考方案1】:

您可以使用row_number() 窗口函数为具有相同 Sub 值的行的每个分区分配编号。使用order by LastUpdated desc,第一行将是最新行:

select  *
from    (
        select  row_number() over (
                    partition by Sub 
                    order by LastUpdated desc) as rn
        ,       *
        from    YourTable
        ) as SubQueryAlias
where   rn = 1

【讨论】:

谢谢!正是我想要弄清楚的。【参考方案2】:

使用 group by 还不够吗?

SELECT DISTINCT MIN(Sub), MAX(LastUpdated), MIN(NAME) FROM TABLE GROUP BY Sub Where Section = 1

【讨论】:

在您的查询中,min(name) 可能与max(LastUpdated) 不属于同一行。

以上是关于从表 SQL 中选择多个不同的行的主要内容,如果未能解决你的问题,请参考以下文章

SQL 选择不同的行,如果为空则忽略行

从表名中选择计数不同的列名作为cnt

从表中选择不同的记录并执行重复行的列总和(托盘、总和)。并显示重复的行一次[关闭]

用于从表中选择具有最新时间戳的行的 JOOQ 代码

SQL查询从键表中选择多个条目到同一行的不同列中

使用嵌套查询从表列表/多个表中选择 - MS SQL