Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何根据分组列A获取列B的值_Sql_Sql Server - Fatal编程技术网

Sql 如何根据分组列A获取列B的值

Sql 如何根据分组列A获取列B的值,sql,sql-server,Sql,Sql Server,我使用Microsoft SQL Server 2019。从一个表中,我想得到B列的值,这取决于a列的值是某个where子句上的最大值 让我们举个小例子 创建表: CREATE TABLE [tblDummy] ( [ID] [int] NOT NULL, [SubID] [int] NULL, [PointInTime] [datetime] NULL, [Value] [decimal](18, 6) NULL, CONSTRAINT [PK_tbl

我使用Microsoft SQL Server 2019。从一个表中,我想得到B列的值,这取决于a列的值是某个where子句上的最大值

让我们举个小例子

创建表:

CREATE TABLE [tblDummy]
(
    [ID] [int] NOT NULL,
    [SubID] [int] NULL,
    [PointInTime] [datetime] NULL,
    [Value] [decimal](18, 6) NULL,

    CONSTRAINT [PK_tblDummy] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
INSERT INTO tblDummy (ID, SubID, PointInTime, Value) 
VALUES (1, 1, {d '2020-01-01'}, 1.1),
       (2, 2, {d '2020-02-01'}, 1.2),
       (3, 3, {d '2020-03-01'}, 1.3),
       (4, 1, {d '2020-04-01'}, 2.1),
       (5, 2, {d '2020-05-01'}, 2.2),
       (6, 3, {d '2020-06-01'}, 2.3),
       (7, 1, {d '2020-07-01'}, 3.1),
       (8, 2, {d '2020-08-01'}, 3.2),
       (9, 3, {d '2020-09-01'}, 3.3),
       (10, 1, {d '2020-10-01'}, 4.1),
       (11, 2, {d '2020-11-01'}, 4.2),
       (12, 3, {d '2020-12-01'}, 4.3)
将数据插入表中:

CREATE TABLE [tblDummy]
(
    [ID] [int] NOT NULL,
    [SubID] [int] NULL,
    [PointInTime] [datetime] NULL,
    [Value] [decimal](18, 6) NULL,

    CONSTRAINT [PK_tblDummy] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
INSERT INTO tblDummy (ID, SubID, PointInTime, Value) 
VALUES (1, 1, {d '2020-01-01'}, 1.1),
       (2, 2, {d '2020-02-01'}, 1.2),
       (3, 3, {d '2020-03-01'}, 1.3),
       (4, 1, {d '2020-04-01'}, 2.1),
       (5, 2, {d '2020-05-01'}, 2.2),
       (6, 3, {d '2020-06-01'}, 2.3),
       (7, 1, {d '2020-07-01'}, 3.1),
       (8, 2, {d '2020-08-01'}, 3.2),
       (9, 3, {d '2020-09-01'}, 3.3),
       (10, 1, {d '2020-10-01'}, 4.1),
       (11, 2, {d '2020-11-01'}, 4.2),
       (12, 3, {d '2020-12-01'}, 4.3)
我想获得每个
SubID的
值,其中
PointInTime
是最大值(超过
SubID

我现在能想到的唯一方法是自连接,类似这样:

SELECT A.SubID, A.Value 
FROM tblDummy AS A
INNER JOIN 
    (SELECT SubID, MAX(PointInTime) AS PIT 
     FROM tblDummy 
     GROUP BY SubID) AS B ON A.SubID = B.SubID AND A.PointInTime = B.PIT
但我不喜欢子查询,也不喜欢联接使用非唯一的列。因此,如果数据包含两次“PointInTime”值(使用相同的“SubID”),那么由于连接,数据将加倍


有没有其他方法可以达到我的目标?也许使用
分区。。。语法问题?

我想您需要窗口功能:

select d.*
from (select d.*,
             row_number() over (partition by subid order by PointInTime desc) as seqnum
      from tblDummy d
     ) d
where seqnum = 1;
您还可以使用相关子查询来表示:

select d.*
from tblDummy d
where d.PointInTime = (select max(d2.PointInTime)
                       from tblDummy d2
                       where d2.subid = d.subid
                      );

这两个查询都可以受益于
tblDummy(subid,PointInTime)

上的索引,但这仍然是一个子查询。对于大量数据(比如一百万行),它是如何“运行”的?@Nostromo窗口函数更适合于大量行