Группировать повторяющиеся строки в TSQL - PullRequest
3 голосов
/ 17 декабря 2008

У меня есть следующая таблица и данные в SQL Server 2005:

create table LogEntries (
  ID int identity,
  LogEntry varchar(100)
)

insert into LogEntries values ('beans')
insert into LogEntries values ('beans')
insert into LogEntries values ('beans')
insert into LogEntries values ('cabbage')
insert into LogEntries values ('cabbage')
insert into LogEntries values ('beans')
insert into LogEntries values ('beans')

Я бы хотел сгруппировать повторяющиеся LogEntries, чтобы у меня были следующие результаты:

LogEntry  EntryCount
beans     3
cabbage   2
beans     2

Можете ли вы придумать способ сделать это в TSQL, кроме использования курсора?

Ответы [ 6 ]

4 голосов
/ 17 декабря 2008

Я думаю, что это сделает это ... хотя не проверил слишком тщательно

select 
    COUNT(*),subq.LogEntry 
from 
(
    select 
        ROW_NUMBER() OVER(ORDER BY id)-ROW_NUMBER() OVER(PARTITION BY logentry ORDER BY id) as t,*
    from 
        LogEntries
) subq 
group by 
    subq.t,subq.LogEntry 
order by 
    MIN(subq.ID)
2 голосов
/ 17 декабря 2008

Это основанное на множестве решение проблемы. Производительность, вероятно, будет отстойной, но она работает:)

CREATE TABLE #LogEntries (
  ID INT IDENTITY,
  LogEntry VARCHAR(100)
)

INSERT INTO #LogEntries VALUES ('beans')
INSERT INTO #LogEntries VALUES ('beans')
INSERT INTO #LogEntries VALUES ('beans')
INSERT INTO #LogEntries VALUES ('cabbage')
INSERT INTO #LogEntries VALUES ('cabbage')
INSERT INTO #LogEntries VALUES ('carrots')
INSERT INTO #LogEntries VALUES ('beans')
INSERT INTO #LogEntries VALUES ('beans')
INSERT INTO #LogEntries VALUES ('carrots')

SELECT logentry, COUNT(*) FROM (
    SELECT logentry, 
    ISNULL((SELECT MAX(id) FROM #logentries l2 WHERE l1.logentry<>l2.logentry AND l2.id < l1.id), 0) AS id
    FROM #LogEntries l1
) AS a
GROUP BY logentry, id


DROP TABLE #logentries 

Результаты:

beans   3
cabbage 2
carrots 1
beans   2
carrots 1

ISNULL () требуется для первого набора bean-компонентов.

1 голос
/ 17 декабря 2008

SQL не совсем моя сильная сторона, но не будет

SELECT LogEntry, COUNT(1) AS Counter FROM LogEntries GROUP BY LogEntry

сделать это?

0 голосов
/ 17 декабря 2008

Теперь я смотрел на eactual вопрос достаточно близко: -)

Хм, на переосмысления, почему бы не просто использовать курсор? Производительность не всегда хуже, чем у прямого SQL - и, конечно же, другим людям будет легко следовать коду, когда они его увидят. Заверните его в хранимую процедуре или функции, и вы сможете использовать его в значительной степени в любом месте вам могут понадобиться.

0 голосов
/ 17 декабря 2008

Если мой мозг еще не загрузился этим утром

SELECT 
  LogEntry, COUNT(LogEntry) as EntryCount
FROM
  LogEntries
GROUP BY
  LogEntry
0 голосов
/ 17 декабря 2008

Я не думаю, что вы можете сделать это с помощью одного запроса. Чтобы обеспечить счет в запросе, необходимо сгруппировать, используя столбец LogEntry. Тем не менее, это просто даст вам общее количество на LogEntry, а не количество номеров в последовательности, которую вы ищете. Я думаю, что нужен курсор (или перенести весь набор данных в ваше приложение, и используйте логику для получения желаемых результатов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...