组在SQL中重复行

时间:2008-12-17 09:34:04

标签: sql sql-server sql-server-2005 tsql

我在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

你能想到在使用游标之外的任何方法吗?

6 个答案:

答案 0 :(得分:4)

我认为这样做会......虽然没有彻底检查

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)

答案 1 :(得分:2)

这是针对该问题的基于集合的解决方案。性能可能很糟糕,但它有效:)

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

第一组bean需要ISNULL()。

答案 2 :(得分:1)

SQL不完全是我的强项,但不会

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

做到了吗?

答案 3 :(得分:0)

我认为你不能用一个查询来做到这一点。为了在查询中提供计数,您需要使用LogEntry列进行分组。但是,这只会给出每个LogEntry的总计数,而不是您要查找的顺序条目数。我认为要调用游标(或将整个数据集带到您的应用程序中,并在那里使用逻辑来获得您想要的结果)。

答案 4 :(得分:0)

除非我的大脑今天早上尚未启动

SELECT 
  LogEntry, COUNT(LogEntry) as EntryCount
FROM
  LogEntries
GROUP BY
  LogEntry

答案 5 :(得分:-1)

现在我已经仔细研究了实际问题: - )

嗯,重新考虑,为什么不用光标呢?性能并不总是比直接SQL差 - 而且当他们来看它时,其他人很容易遵循代码。将它包装在存储过程或函数中,您几乎可以在任何需要的地方使用它。