我有一个名为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'
答案 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