如何按列分组 - SQL 服务器
How to Group By a column - SQL Server
我需要按 UniqueIdentifier
列分组,table 还包含 XML 列。
Table 架构:StudentMark:
CREATE TABLE [dbo].[StudentMark]
(
[StudentMarkId] [int] IDENTITY(1,1) NOT NULL,
[StudentId] [uniqueidentifier] NULL,
[SubjectId] [uniqueidentifier] NULL,
[ScoreInfo] [xml] NULL,
[GeneratedOn] [datetime2](2) NOT NULL,
CONSTRAINT [PK_StudentMark]
PRIMARY KEY CLUSTERED ([StudentMarkId] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
样本种子数据
INSERT INTO [dbo].[StudentMark] ([StudentId], [SubjectId], [ScoreInfo], GeneratedOn])
VALUES ('FC3CB475-B480-4129-9190-6DE880E2D581', '0D72F79E-FB48-4D3E-9906-B78A9D105081', '<StudentMarkAttribute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></StudentMarkAttribute>', '2017-08-10 10:20:15'),
('0F4EF48C-93E3-41AA-8295-F6B0E8D8C3A2', '0D72F79E-FB48-4D3E-9906-B78A9D105081', '<StudentMarkAttribute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></StudentMarkAttribute>', '2017-08-10 10:20:15'),
('0F4EF48C-93E3-41AA-8295-F6B0E8D8C3A2', 'AB172272-D2E9-49E1-8040-6117BB6743DB', '<StudentMarkAttribute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></StudentMarkAttribute>', '2017-08-16 09:06:20'),
('FC3CB475-B480-4129-9190-6DE880E2D581', 'AB172272-D2E9-49E1-8040-6117BB6743DB', '<StudentMarkAttribute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></StudentMarkAttribute>', '2017-08-16 09:06:20');
需求:我需要按[dbo].[StudentMark].[StudentId]
分组,取最新记录
我尝试了以下 SQL 查询,但它导致了错误
SELECT
MAX([StudentMarkId]), [StudentId], [SubjectId], [ScoreInfo], [GeneratedOn]
FROM
[dbo].[StudentMark]
GROUP BY
[StudentId]
错误:
Column 'dbo.StudentMark.SubjectId' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
我参考了以下问题,但无法解决:Reason for Column is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause
请帮助我。
使用ROW_NUMBER
计算组内位置:
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER(PARTITION BY StudentId ORDER BY StudentMarkId DESC) AS rn
FROM [dbo].[StudentMark]) sub
WHERE sub.rn = 1;
如果您有 Students
table:
,则替代解决方案效果最佳
select sm.*
from students s cross apply
(select top 1 sm.*
from studentmark sm
where sm.studentid = s.studentid
order by sm.generatedon desc
) sm;
您不能按 XML
或 TEXT
列分组,您首先需要转换为 varchar(max)
:
SELECT
MAX([StudentMarkId]), [StudentId], [SubjectId],
CONVERT(XML, CONVERT(VARCHAR(MAX), [ScoreInfo])) DetailXML,
[GeneratedOn]
FROM
[dbo].[StudentMark]
GROUP BY
[StudentId], [SubjectId],
CONVERT(VARCHAR(MAX), [ScoreInfo]), [GeneratedOn]
第一行转换成varchar(max)来匹配GROUP BY子句,后面又转回XML.
我需要按 UniqueIdentifier
列分组,table 还包含 XML 列。
Table 架构:StudentMark:
CREATE TABLE [dbo].[StudentMark]
(
[StudentMarkId] [int] IDENTITY(1,1) NOT NULL,
[StudentId] [uniqueidentifier] NULL,
[SubjectId] [uniqueidentifier] NULL,
[ScoreInfo] [xml] NULL,
[GeneratedOn] [datetime2](2) NOT NULL,
CONSTRAINT [PK_StudentMark]
PRIMARY KEY CLUSTERED ([StudentMarkId] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
样本种子数据
INSERT INTO [dbo].[StudentMark] ([StudentId], [SubjectId], [ScoreInfo], GeneratedOn])
VALUES ('FC3CB475-B480-4129-9190-6DE880E2D581', '0D72F79E-FB48-4D3E-9906-B78A9D105081', '<StudentMarkAttribute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></StudentMarkAttribute>', '2017-08-10 10:20:15'),
('0F4EF48C-93E3-41AA-8295-F6B0E8D8C3A2', '0D72F79E-FB48-4D3E-9906-B78A9D105081', '<StudentMarkAttribute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></StudentMarkAttribute>', '2017-08-10 10:20:15'),
('0F4EF48C-93E3-41AA-8295-F6B0E8D8C3A2', 'AB172272-D2E9-49E1-8040-6117BB6743DB', '<StudentMarkAttribute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></StudentMarkAttribute>', '2017-08-16 09:06:20'),
('FC3CB475-B480-4129-9190-6DE880E2D581', 'AB172272-D2E9-49E1-8040-6117BB6743DB', '<StudentMarkAttribute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></StudentMarkAttribute>', '2017-08-16 09:06:20');
需求:我需要按[dbo].[StudentMark].[StudentId]
分组,取最新记录
我尝试了以下 SQL 查询,但它导致了错误
SELECT
MAX([StudentMarkId]), [StudentId], [SubjectId], [ScoreInfo], [GeneratedOn]
FROM
[dbo].[StudentMark]
GROUP BY
[StudentId]
错误:
Column 'dbo.StudentMark.SubjectId' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
我参考了以下问题,但无法解决:Reason for Column is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause
请帮助我。
使用ROW_NUMBER
计算组内位置:
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER(PARTITION BY StudentId ORDER BY StudentMarkId DESC) AS rn
FROM [dbo].[StudentMark]) sub
WHERE sub.rn = 1;
如果您有 Students
table:
select sm.*
from students s cross apply
(select top 1 sm.*
from studentmark sm
where sm.studentid = s.studentid
order by sm.generatedon desc
) sm;
您不能按 XML
或 TEXT
列分组,您首先需要转换为 varchar(max)
:
SELECT
MAX([StudentMarkId]), [StudentId], [SubjectId],
CONVERT(XML, CONVERT(VARCHAR(MAX), [ScoreInfo])) DetailXML,
[GeneratedOn]
FROM
[dbo].[StudentMark]
GROUP BY
[StudentId], [SubjectId],
CONVERT(VARCHAR(MAX), [ScoreInfo]), [GeneratedOn]
第一行转换成varchar(max)来匹配GROUP BY子句,后面又转回XML.