Sql 如何根据分组列A获取列B的值
我使用Microsoft SQL Server 2019。从一个表中,我想得到B列的值,这取决于a列的值是某个where子句上的最大值 让我们举个小例子 创建表: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
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窗口函数更适合于大量行