2015-07-19 33 views
2

我有类似下面的数据库:如何在使用GROUP BY时获取所有行?

id | col_1 | col_2 
------------------ 
1 | a | x 
2 | a | x 
3 | b | x 
4 | b | z 
5 | c | x 

我想拿到赛COL_2 = x加COL_1的频率,由频率排序的所有行。例如,输出将是:

id | col_1 | col_2 | freq 
------------------------- 
1 | a | x | 2 
2 | a | x | 2 
3 | b | x | 1 
5 | c | x | 1 

我已经试过各种查询,但因为我使用GROUP BY获得的频率,我无法获得各行(因为我希望每个ID)。例如:

SELECT *, COUNT(col_1) AS freq 
FROM mytable WHERE col_2 = x 
GROUP BY col_1 
ORDER BY freq DESC 

不幸的是,这并没有给我所有的行。它留下id = 2。任何帮助将不胜感激!

谢谢!

回答

1

freq柱看起来像行,其中col_2 = 'x'的一个独立的,表范围计数,按id分组。你可以使用此查询:

这里是SQL FIDDLE DEMO

SELECT 
    col_1, 
    COUNT(*) AS freq 
FROM myTable 
WHERE col_2 = 'x' 
GROUP BY col_1 

它加入到个人id值的查询,你应该得到你之后的结果:

SELECT 
    id, 
    col_1, 
    col_2, 
    col2Summary.freq 
FROM myTable 
INNER JOIN (
    SELECT 
    col_1, 
    COUNT(*) AS freq 
    FROM myTable 
    WHERE col_2 = 'x' 
    GROUP BY col_1 
) col2Summary ON myTable.col_1 = col2Summary.col_1 
WHERE col_2 = 'x' 
ORDER BY freq DESC 
0

您的COL_2需要组由太

同时删除*和仅包含在GROUP BY列

SELECT col_1, col_2, COUNT(*) AS freq 
FROM mytable 
WHERE col_2 = x 
GROUP BY col_1, col_2 
ORDER BY freq DESC 
+0

@jeremytwfortune我们不知道OP需要什么,也许他需要在网格中显示结果。但是,你可以有相同的计数()结果 –

+0

OP明确表示他希望在输出中有'id'。你的解决方案不会这样做。 –

+0

@jeremytwfortune,OP确实提供了清晰显示'id'和'count'的所需输出。一起。这才是重点。它不仅仅是一个简单的“分组”。 –

1

这是使用Scalar子查询重写的@EdGibbs解决方案。 MySQL的创建一个不同的计划,你应该测试其更有效(fiddle):

SELECT 
    id, 
    col_1, 
    col_2, 
    (SELECT COUNT(*) 
    FROM myTable AS t2 
    WHERE t.col_1 = t2.col_1 
    AND col_2 = 'x') AS freq 
FROM myTable AS t 
WHERE col_2 = 'x' 
ORDER BY freq DESC; 

顺便说一句,几乎所有其他DBMS支持窗口化集合函数和那么这将是一个简单的:

COUNT(*) OVER (PARTITION BY col_1) AS freq