一个简单但具有挑战性的SQL问题,至少我找不到出路,除了外部做(c#)

stc*_*flw 3 sql t-sql sql-server algorithm

我有一个SQL表,只包含1列

Column Name
A 
A
A
B
B
B
B
C
D
D
E
Run Code Online (Sandbox Code Playgroud)

我需要一个返回切割点的SQL代码.对于上表,它将返回:

Column Name
    3
    7
    8
    10
    11
Run Code Online (Sandbox Code Playgroud)

3是A的末尾,7是B的末尾,8是C的末尾,依此类推......

让我们看看你能想出什么:=)

Lie*_*ers 16

假设数据可以在您的数据上排序Column,计划是row number为每一行生成一个并执行a group by检索您的数据点.

SQL Server 2000

DECLARE @YourTable TABLE (Col VARCHAR(1))
CREATE TABLE #TempTable (ID INTEGER IDENTITY(1, 1), Col VARCHAR(1))

SET IDENTITY_INSERT #TempTable OFF
INSERT INTO @YourTable (Col) VALUES ('A')
INSERT INTO @YourTable (Col) VALUES ('A')
INSERT INTO @YourTable (Col) VALUES ('A')
INSERT INTO @YourTable (Col) VALUES ('B')
INSERT INTO @YourTable (Col) VALUES ('B')
INSERT INTO @YourTable (Col) VALUES ('B')
INSERT INTO @YourTable (Col) VALUES ('B')
INSERT INTO @YourTable (Col) VALUES ('C')
INSERT INTO @YourTable (Col) VALUES ('D')
INSERT INTO @YourTable (Col) VALUES ('D')
INSERT INTO @YourTable (Col) VALUES ('E')

INSERT INTO #TempTable
SELECT      *
FROM        @YourTable
ORDER BY    Col

SELECT    MAX(ID)
FROM      #TempTable
GROUP BY  Col

DROP TABLE #TempTable
Run Code Online (Sandbox Code Playgroud)

SQL Server 2005

DECLARE @Table TABLE (Col VARCHAR(1))

INSERT INTO @Table VALUES ('A')
INSERT INTO @Table VALUES ('A')
INSERT INTO @Table VALUES ('A')
INSERT INTO @Table VALUES ('B')
INSERT INTO @Table VALUES ('B')
INSERT INTO @Table VALUES ('B')
INSERT INTO @Table VALUES ('B')
INSERT INTO @Table VALUES ('C')
INSERT INTO @Table VALUES ('D')
INSERT INTO @Table VALUES ('D')
INSERT INTO @Table VALUES ('E')


SELECT  MAX(RowNumber)
FROM    (SELECT RowNumber = ROW_NUMBER() OVER (ORDER BY Col), Col
         FROM   @Table) t
GROUP BY Col
Run Code Online (Sandbox Code Playgroud)