我想要显示一个额外的列,它将显示第一次出现,第二次出现等等

时间:2013-12-17 12:13:33

标签: mysql sql count

我有一个名为compare的表和一个名为field的列我要查找计数和出现次数。 我使用下面的命令显示了计数

但是我希望显示一个附加列,它将显示第一次出现,第二次出现等等。

P.S我正在使用mysql。

 on executing select * from compare I get:
 field
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 21
 22

    select field, count(*) as count
    from compare
    group by field
    order by count desc, field








present output
field1, count 
'21\r', '2'
'22\r', '2'
'23\r', '1'
'24\r', '1'
'25\r', '1'
'26\r', '1'
'27\r', '1'
'28\r', '1'
'29\r', '1'
'30\r', '1'

预期产出

 field1, count     occurrence
'21\r', '2'             '1'
'22\r', '2'             '1'
'23\r', '1'             '1'
'24\r', '1'             '1'
'25\r', '1'             '1'
'26\r', '1'             '1'
'27\r', '1'             '1'
'28\r', '1'             '1'
'29\r', '1'             '1'
'30\r', '1'             '1'
'21\r', '2'             '2'
'22\r', '2'             '2'

有一个大约50 MB的日志文件,我想与自己进行比较。我正在将文本文件中的数据导入compare1表的field1列。

使用dan的方式:

(select field1, count(*) as count,
@row_num := IF(@prev_value=field1,@row_num+1,1) AS Occurence,
@prev_value := field1
from compare1
group by field1
order by count desc, field1);

我明白了:

field1,count,Occurence,@ prev_value:= field1

'21', '2', '1',                         '21'
'22', '2', '1',                         '22'
'23', '1', '1',                         '23'
'24', '1', '1',                         '24'
'25', '1', '1',                         '25'
'26', '1', '1',                         '26'
'27', '1', '1',                         '27'
'28', '1', '1',                         '28'
'29', '1', '1',                         '29'
'30', '1', '1',                         '30'

我需要:

field1, count, Occurence, @prev_value := field1
 21', '2', '1',                         '21'
'22', '2', '1',                         '22'
'23', '1', '1',                         '23'
'24', '1', '1',                         '24'
'25', '1', '1',                         '25'
'26', '1', '1',                         '26'
'27', '1', '1',                         '27'
'28', '1', '1',                         '28'
'29', '1', '1',                         '29'
'30', '1', '1',                         '30'
'21', '2', '2',                         '21'
'22', '2', '2',                         '22'

1 个答案:

答案 0 :(得分:0)

您使用的是什么RDBMS?在SQL Server 2008或更高版本上,您可以使用窗口函数:

SELECT 
    Field,
    COUNT(*) OVER (PARTITION BY Field) AS Count,
    ROW_NUMBER() OVER (PARTITION BY Field ORDER BY Field) AS Occurence
FROM Compare

在其他系统上,你可以尝试这样的事情:

SELECT
    Field,
    Count,
    T2.Number
FROM (
    SELECT
        Field,
        COUNT(*) AS Count        
    FROM Compare
) T1 
INNER JOIN Numbers T2 ON T2.Number >= 1 AND T2.Number <= T1.Count

在最后一个查询中,我假设您有一个名为“Numbers”的表,其中包含一列“Number”,其中包含记录1,2,3,4等。此表使用实际计数连接到Compare表发生的事件,每次出现时产生一个记录,数量越来越多。

或者,在MySQL上,您可以使用变量对出现次数进行编号,从而无需使用Numbers表进行连接:

SELECT
    Field,
    (SELECT COUNT(*) FROM Compare T2 WHERE T2.Field = T1.Field) AS Count,
    @row_num := IF(@prev_value=Field,@row_num+1,1) AS Occurence,
    @prev_value := Field
FROM Compare T1,
    (SELECT @row_num := 1) x,
    (SELECT @prev_value := '') y
ORDER BY Field