SQL Server:每组第二个最大值

拉木

我有一张数据如下的表

CREATE TABLE Tbl
(
  ID VARCHAR(20)
  , Desc1 VARCHAR(30)
  , BALANCE_DATE DATE
);

INSERT INTO Tbl (ID, Desc1, BALANCE_DATE)
VALUES ('ID1', 'Desc 1', '10/18/2015')
  , ('ID1', 'Desc 2', '10/19/2015')
  , ('ID1', 'Desc 3', '10/22/2015')
  , ('ID1', 'Desc 4', GETDATE())
  , ('ID2', 'Desc 1', '9/18/2015')
  , ('ID2', 'Desc 2', '9/1/2015')
  , ('ID2', 'Desc 3', '9/28/2015')
  , ('ID2', 'Desc 4', GETDATE());

╔═════╦════════╦════════════════╗
║ ID  ║ Desc1  ║ BALANCE_DATE   ║
╠═════╬════════╬════════════════╣
║ ID1 ║ Desc 1 ║ 10/18/2015     ║
║ ID1 ║ Desc 2 ║ 10/19/2015     ║
║ ID1 ║ Desc 3 ║ 10/22/2015     ║
║ ID1 ║ Desc 4 ║ 11/21/2015     ║
║ ID2 ║ Desc 1 ║ 09/18/2015     ║
║ ID2 ║ Desc 2 ║ 09/01/2015     ║
║ ID2 ║ Desc 3 ║ 09/28/2015     ║
║ ID2 ║ Desc 4 ║ 11/21/2015     ║
╚═════╩════════╩════════════════╝

我需要获取除当前日期以外的最新日期的行。

预期产量:

╔═════╦════════╦════════════╗
║ ID1 ║ Desc 3 ║ 10/22/2015 ║
║ ID2 ║ Desc 3 ║ 9/28/2015  ║
╚═════╩════════╩════════════╝

如何查询呢?

埃瓦尔达斯(Evaldas Buinauskas)

尽管Joe的答案行之有效,但我强烈建议在这种情况下使用排名函数,您不必两次连接表,这对他们来说是一个完美的用例。这将是以下查询:

DECLARE @Tbl TABLE
(
  ID VARCHAR(20)
  , Desc1 VARCHAR(30)
  , BALANCE_DATE DATE
);


INSERT INTO @Tbl (ID, Desc1, BALANCE_DATE)
VALUES ('ID1', 'Desc 1', '10/18/2015')
  , ('ID1', 'Desc 2', '10/19/2015')
  , ('ID1', 'Desc 3', '10/22/2015')
  , ('ID1', 'Desc 4', GETDATE())
  , ('ID2', 'Desc 1', '9/18/2015')
  , ('ID2', 'Desc 2', '9/1/2015')
  , ('ID2', 'Desc 3', '9/28/2015')
  , ('ID2', 'Desc 4', GETDATE());
  
;WITH CTE(ID, Desc1, BALANCE_DATE, RN)
AS (
  SELECT ID
    , Desc1
    , BALANCE_DATE
    , DENSE_RANK() OVER(PARTITION BY Id ORDER BY BALANCE_DATE DESC)
  FROM @Tbl
 )
SELECT T.ID
  , T.Desc1
  , T.BALANCE_DATE
FROM CTE AS T
WHERE T.RN = 2;

###结果:

╔═════╦════════╦═════════════════════╗
║ ID  ║ Desc1  ║    BALANCE_DATE     ║
╠═════╬════════╬═════════════════════╣
║ ID1 ║ Desc 3 ║ 2015-10-22 00:00:00 ║
║ ID2 ║ Desc 3 ║ 2015-09-28 00:00:00 ║
╚═════╩════════╩═════════════════════╝

此查询应始终为每个具有第二高日期的ID选择行。

如果要在线测试,请参阅data.stackexchange.com上的构造查询

###更新

INSERT INTO @Tbl (ID, Desc1, BALANCE_DATE)
VALUES ('ID1', 'Desc 1', '10/18/2015')
  , ('ID1', 'Desc 2', '10/19/2015')
  , ('ID1', 'Desc 3', '10/22/2015')
  , ('ID1', 'Desc 4', GETDATE())
  , ('ID2', 'Desc 1', '9/18/2015')
  , ('ID2', 'Desc 2', '9/1/2015')
  , ('ID2', 'Desc 3', '9/28/2015')
  , ('ID2', 'Desc 4', GETDATE())
  , ('ID3', 'Desc 1', '10/18/2015')
  , ('ID3', 'Desc 2', '10/15/2015');

;WITH CTE(ID, Desc1, BALANCE_DATE, RN)
AS (
  SELECT ID
    , Desc1
    , BALANCE_DATE
    , DENSE_RANK() OVER(PARTITION BY Id ORDER BY BALANCE_DATE DESC)
  FROM @Tbl
  WHERE BALANCE_DATE < CONVERT(DATE, GETDATE())
 )
SELECT T.ID
  , T.Desc1
  , T.BALANCE_DATE
FROM CTE AS T
WHERE T.RN = 1;

###结果:

╔═════╦════════╦══════════════╗
║ ID  ║ Desc1  ║ BALANCE_DATE ║
╠═════╬════════╬══════════════╣
║ ID1 ║ Desc 3 ║ 2015-10-22   ║
║ ID2 ║ Desc 3 ║ 2015-09-28   ║
║ ID3 ║ Desc 1 ║ 2015-10-18   ║
╚═════╩════════╩══════════════╝

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL将一个表连接到第二个表中包含每组最大值的行的选择

来自分类Dev

如何使用 SQL 获得第二个最大值?

来自分类Dev

sql 数据库,有多个 where,第二个最大值

来自分类Dev

sql获取第一个和第二个最大值的条件

来自分类Dev

从第二个表访问SQL显示值

来自分类Dev

仅当SQL中没有最高的最大数且不返回空值时,才获取第二个最大数

来自分类Dev

SQL比较第一个或第二个值对

来自分类Dev

在第二个查询SQL中使用一个查询的值

来自分类Dev

SQL:查询显示最大日期(第一个和第二个最大日期)

来自分类Dev

oracle SQL:获取字符串的每个第二个值

来自分类Dev

第二个SQL查询,其值来自文本字段

来自分类Dev

sql查询一次获取第二个表的值

来自分类Dev

打开VS的第二个实例时,Visual Studio 2013无法连接SQL Server

来自分类Dev

使用 JSON PHP SQL Server 填充第二个下拉列表

来自分类Dev

从第二个查询SQL添加列

来自分类Dev

SQL根据第二个表中的值列表从第一个表中选择

来自分类Dev

连接两个SQL查询。在第二个查询中使用ID获取名称的值

来自分类Dev

如何使用第二个 sql 的名称从第一个表中删除值

来自分类Dev

SQL Server:从第一个表链接到第二个表的主键的多个外键

来自分类Dev

SQL Server:从一个表中获取所有数据,但条件是第二个表列

来自分类Dev

从一个SELECT查询到第二个SELECT查询的SQL SERVER JOIN ID行

来自分类Dev

SQL Server:使用第一个插入的输出插入第二个表

来自分类Dev

SQL Server-根据第二个表中的最早日期加入两个表

来自分类Dev

SQL Server:从第一个表链接到第二个表的主键的多个外键

来自分类Dev

SQL Server:如何获取单词中的第一个或第二个字母?

来自分类Dev

如何在 SQL 和 LINQ 中获取每个员工的第二个最高工资的值?

来自分类Dev

SQL Server Analysis Services中的多对多关系;第二个多对多关系不起作用

来自分类Dev

如何在SQL Server SELECT的第二个联接表中按ID选择每个记录的顶部?

来自分类Dev

SQL Server AFTER INSERT 触发器每次插入更新第二个表多次

Related 相关文章

  1. 1

    SQL将一个表连接到第二个表中包含每组最大值的行的选择

  2. 2

    如何使用 SQL 获得第二个最大值?

  3. 3

    sql 数据库,有多个 where,第二个最大值

  4. 4

    sql获取第一个和第二个最大值的条件

  5. 5

    从第二个表访问SQL显示值

  6. 6

    仅当SQL中没有最高的最大数且不返回空值时,才获取第二个最大数

  7. 7

    SQL比较第一个或第二个值对

  8. 8

    在第二个查询SQL中使用一个查询的值

  9. 9

    SQL:查询显示最大日期(第一个和第二个最大日期)

  10. 10

    oracle SQL:获取字符串的每个第二个值

  11. 11

    第二个SQL查询,其值来自文本字段

  12. 12

    sql查询一次获取第二个表的值

  13. 13

    打开VS的第二个实例时,Visual Studio 2013无法连接SQL Server

  14. 14

    使用 JSON PHP SQL Server 填充第二个下拉列表

  15. 15

    从第二个查询SQL添加列

  16. 16

    SQL根据第二个表中的值列表从第一个表中选择

  17. 17

    连接两个SQL查询。在第二个查询中使用ID获取名称的值

  18. 18

    如何使用第二个 sql 的名称从第一个表中删除值

  19. 19

    SQL Server:从第一个表链接到第二个表的主键的多个外键

  20. 20

    SQL Server:从一个表中获取所有数据,但条件是第二个表列

  21. 21

    从一个SELECT查询到第二个SELECT查询的SQL SERVER JOIN ID行

  22. 22

    SQL Server:使用第一个插入的输出插入第二个表

  23. 23

    SQL Server-根据第二个表中的最早日期加入两个表

  24. 24

    SQL Server:从第一个表链接到第二个表的主键的多个外键

  25. 25

    SQL Server:如何获取单词中的第一个或第二个字母?

  26. 26

    如何在 SQL 和 LINQ 中获取每个员工的第二个最高工资的值?

  27. 27

    SQL Server Analysis Services中的多对多关系;第二个多对多关系不起作用

  28. 28

    如何在SQL Server SELECT的第二个联接表中按ID选择每个记录的顶部?

  29. 29

    SQL Server AFTER INSERT 触发器每次插入更新第二个表多次

热门标签

归档