SQL Server按组分组,但选择“top”日期

4

我在SQL Server中有一张表,格式如下(请注意ID字段不唯一):

-----------------------------------
| ID | IsAdamBrown | DateComplete |
| 1  |     TRUE    | 2017-01-01   |
| 1  |     TRUE    | 2017-01-03   |
-----------------------------------

我希望选择表中所有唯一ID的一行,以及该ID的最近'DateComplete'。

在这种情况下,我的期望输出是:

-----------------------------------
| ID | IsAdamBrown | DateComplete |
| 1  |     TRUE    | 2017-01-03   |
-----------------------------------

我已经尝试过:

  SELECT DISTINCT DateComplete, ID, IsAdamBrown 
  FROM thisTable
  WHERE IsAdamBrown IS NOT NULL
  GROUP BY DateComplete, ID, IsAdamBrown
  ORDER BY DateComplete DESC

不幸的是,我仍然会返回两个日期行。在MySQL中,我只会按前两行分组,ORDER BY 会确保 DateComplete 是最近的。SQL服务器要求 SELECT 字段与 GROUP BY 匹配,这使得这种情况不可能。

如何获取每个 ID 的单个行,并且该行具有最新的 DateComplete?


“Most Recent”日期是指最接近今天的日期,还是指最近输入到数据库中的日期?如果是前者,您可以使用Max(DateComplete)。对于后者,我不确定您提供的表中是否有足够的信息来获取它。 - Obsidian Phoenix
@ObsidianPhoenix 我的意思是最接近今天的日期。 - blarg
5个回答

3

选择 id、isadambrown 和最大的 datecomplete 作为 DateComplete 从 thistable 表格中进行分组,并按照最大的 datecomplete 降序排列。


为什么要按IsAdamBrown分组?如果ID相同但IsAdamBrown不同,哪个结果是正确的? - Tien Nguyen Ngoc
如果您想按isadambrown分组,则@arulkumar的答案是最合适的。 - Jibin Balachandran

1
您可以通过使用MAX()函数对DateComplete进行分组GROUP BY
  SELECT ID, IsAdamBrown, MAX(DateComplete) AS DateComplete
  FROM thisTable
  WHERE IsAdamBrown IS NOT NULL
  GROUP BY ID, IsAdamBrown
  ORDER BY MAX(DateComplete) DESC

OP说:“我想为表中所有唯一ID选择一行,并选择该ID的最近“DateComplete”。”如果有一个记录具有ID 1和IsAdamBrown False,会如何处理? - Jibin Balachandran

0

你可以使用 LIMIT

  SELECT ID, IsAdamBrown, DateComplete
  FROM thisTable
  WHERE IsAdamBrown IS NOT NULL
  GROUP BY ID, IsAdamBrown
  ORDER BY DateComplete LIMIT 1

LIMIT 1?, question tagged with SQL-Server - Arulkumar
此外,表中将返回多个ID,这是查询的结果。如果之前没有表述清楚,敬请谅解。 - blarg

0

你可以使用这个。我希望它能对你有用。

SELECT ID, IsAdamBrown, DateComplete
  FROM thisTable a
  WHERE DateComplete IN 
(
SELECT MAX(DateComplete) FROM thisTable b WHERE a.ID = b.ID GROUP BY b.ID
) ORDER BY DateComplete DESC

0

您可以使用ROW_NUMBER()按照ID进行分组,并使用子查询获取最近的第一条记录。这将首先根据ID和最近的iscomplete对数据进行排序,然后获取所有唯一ID的第一个结果。

SELECT X.ID, X.IsAdamBrown, X.DateComplete 
FROM ( SELECT ID, IsAdamBrown, DateComplete,ROW_NUMBER() OVER(PARTITION BY ID ORDER BY DateComplete DESC) RN
       FROM thisTable
       WHERE IsAdamBrown IS NOT NULL    ) X
WHERE X.RN=1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接