代码之家  ›  专栏  ›  技术社区  ›  Lance Fisher

将TSQL中的重复行分组

  •  3
  • Lance Fisher  · 技术社区  · 16 年前

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

    我想对重复的日志条目进行分组,以便得到以下结果:

    LogEntry  EntryCount
    beans     3
    cabbage   2
    beans     2
    

    在TSQL中,除了使用光标之外,您能想出任何方法来做到这一点吗?

    6 回复  |  直到 9 年前
        1
  •  2
  •   Jonas Lincoln    16 年前

    这是一个基于集合的问题解决方案。这场演出可能会很糟糕,但效果不错:)

    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
  •  4
  •   spender    16 年前

    我想这会成功的…不过检查得不太彻底

    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)
    
        3
  •  1
  •   The Archetypal Paul    16 年前

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

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

    做到了吗?

        4
  •  0
  •   Yaakov Ellis NevilleDNZ    16 年前

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

        5
  •  0
  •   Sabyasachi Mishra    9 年前

    除非今天早上我的大脑还没有启动

    SELECT 
      LogEntry, COUNT(LogEntry) as EntryCount
    FROM
      LogEntries
    GROUP BY
      LogEntry
    
        6
  •  -1
  •   kpollock    16 年前

    现在,我已经仔细研究了每个问题了——)

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