Простой, но сложный вопрос SQL, по крайней мере, я не мог найти выход, кроме как сделать это внешне (c #) - PullRequest
3 голосов
/ 28 января 2010

У меня есть таблица SQL, которая состоит только из 1 столбца

Column Name
A 
A
A
B
B
B
B
C
D
D
E

Мне нужен код SQL, который возвращает точки разреза. Для приведенной выше таблицы он вернет:

Column Name
    3
    7
    8
    10
    11

3 - это конец А, 7 - это конец В, а 8 - это конец С и так далее ...

Посмотрим, что вы можете придумать: =)

Ответы [ 3 ]

16 голосов
/ 28 января 2010

Предполагая, что данные могут быть отсортированы на вашем Column, план состоит в том, чтобы сгенерировать row number для каждой строки и выполнить 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

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
3 голосов
/ 28 января 2010
with endings(columnname, ending) as
(
    select columnname, row_number() over (order by columnname) as 'ending'
    from theTable
)
select max(ending)
from endings
group by columnname
1 голос
/ 23 июня 2011

Решение для Oracle:

Предполагая, что имя столбца COL1,

SELECT COL1,MAX(ROWNUM)
  FROM TEST_CHARS
 GROUP BY COL1
 ORDER BY COL1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...