2017-08-17 1 views
1

Ich muss nach einer Spalte gruppieren, die Tabelle enthält auch die XML-Spalte.Gruppieren nach einer Spalte - SQL Server

Tabellenschema: 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] 

Beispiel Seed-Daten

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'); 

Anforderung: Ich muss zu einer Gruppe von [dbo].[StudentMark].[StudentId] und die letzte Platte nehmen.

Ich habe versucht, die folgende SQL-Abfrage, aber es verursacht einen Fehler

SELECT 
    MAX([StudentMarkId]), [StudentId], [SubjectId], [ScoreInfo], [GeneratedOn] 
FROM 
    [dbo].[StudentMark] 
GROUP BY 
    [StudentId] 

Fehler:

Spalte 'dbo.StudentMark.SubjectId' in der Auswahlliste ungültig ist, weil es weder in einer Aggregatfunktion noch in der GROUP BY-Klausel enthalten.

ich jemals die folgende Frage, aber ich kann es nicht reparieren: Reason for Column is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause

bitte mir helfen.

Antwort

3

Verwenden ROW_NUMBER Position innerhalb der Gruppe zu berechnen:

SELECT * 
FROM (
    SELECT *, 
     ROW_NUMBER() OVER(PARTITION BY StudentId ORDER BY StudentMarkId DESC) AS rn 
    FROM [dbo].[StudentMark]) sub 
WHERE sub.rn = 1; 
+0

Könnten Sie bitte bestätigen, können wir nicht die 'Gruppe von' verwenden? anstelle von 'Row_Number' Ansatz? –

+0

@ B.Balamandigandan Sie können GROUP BY nicht in der von Ihnen vorgeschlagenen Weise verwenden. Ihr Problem ist klar "größte Nth pro Gruppe" – lad2025

+0

Könnten Sie bitte bestätigen, welche Antwort vorzuziehen ist? In Bezug auf die Optimierung aus zwei Antworten? –

1

Eine alternative Lösung funktioniert am besten, wenn Sie eine Students Tabelle haben:

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; 
+0

Könnten Sie bitte bestätigen, welche ist vorzuziehen Sie Ansatz oder 'Row_Number' Ansatz? Welches ist effizient? –

+0

@ B. Balamandigandan. . . Sie sollten Ihre Daten anprobieren, um zu sehen, welche besser funktioniert. Mit einem Index für "studentid, generatedon" würde ich erwarten, dass dies etwas schneller ist. –

0

Sie können durch XML oder TEXT Spalten nicht Gruppe, würden Sie zuerst müssen in varchar(max) konvertiert werden:

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] 

In der ersten Zeile wird es in varchar (max) konvertiert, um der GROUP BY-Klausel zu entsprechen, und später wird es erneut in XML umgewandelt.

+0

Es gibt alle vier Datensätze zurück. –

Verwandte Themen