按多列分组以获取月份的常见条目
Posted
技术标签:
【中文标题】按多列分组以获取月份的常见条目【英文标题】:group by multiple columns to get common entries for month 【发布时间】:2014-02-19 10:29:25 【问题描述】:请参阅下面的 mysql 表。
-
-
-- Table structure for table `sample_table`
--
CREATE TABLE IF NOT EXISTS `sample_table` (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`station` varchar(300) NOT NULL,
`city` varchar(300) NOT NULL,
`reviewcount` int(6) NOT NULL,
`result_month` varchar(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
INSERT INTO `sample_table`(`id`, `station`, `reviewcount`, `result_month`) VALUES
(1, 'A','NewYork', 10, 'Jan'),
(2, 'B','NewYork', 12, 'Jan'),
(3, 'C','Florida', 14, 'Jan'),
(4, 'A','NewYork', 12, 'Feb'),
(5, 'B','NewYork', 14, 'Feb'),
(6, 'C','Florida', 20, 'Feb'),
(7, 'D','Washington', 12, 'Feb'),
(8, 'A','NewYork', 14, 'Mar'),
(9, 'B','NewYork', 14, 'Mar'),
(10, 'C','Florida', 28, 'Mar');
在这里,我需要在一段时间内获取相同的电台信息。
即,如果我们选择范围从一月到三月,则应显示具有每个月结果行的站点。
这里只有 A 站和 C 站在所选范围内(即从 1 月到 3 月)的每个月都有评论计数。
因此我需要得到类似的结果
A - Jan - 10
C - Jan - 14
A - Feb - 12
C - Feb - 20
A - Mar - 14
C - Mar - 28
我尝试了GROUP BY station,result_month,也尝试了表的JOIN,但是没有用。
我正在处理一个包含数千个站点的巨大表,我也需要优化查询。
第二部分
我还需要获取城市综合信息, 输出应该是什么样子的,
City -Station Count - Review Count
NewYork - 2 - 22 -Jan
Florida - 1 - 14 - Jan
NewYork - 2 - 26 -Jan
Florida - 1 - 10 - Jan
NewYork - 2 - 28 -Jan
Florida - 1 - 28 - Jan
任何帮助将不胜感激。提前感谢。
【问题讨论】:
在您提供的示例中,没有任何内容可以仅将 1 个子句 WHERE station IN ('A','C') 分组。当多行具有相同的数据时使用分组(可能略有不同,例如不同的评论计数) 在这种情况下,站数以十万为单位。在 IN 子句中放入数以万计的条目是一种好习惯吗? 那些是真正的 DDL 吗?!?!?而且,在南亚以外没有人知道 10 万是什么(尽管我承认这是相当多的人)! @Strawberry 对不起我的错误。我应该说百万而不是十万 【参考方案1】:第一阶段是获取每个月都有入口的电台:
SELECT station
FROM sample_table
GROUP BY station
HAVING COUNT(DISTINCT result_month) =
(SELECT COUNT(DISTINCT result_month) FROM sample_table);
这将为您提供 A 和 C (Example on SQL Fiddle)。
然后您可以将其加入到您的主表中:
SELECT t.station, t.reviewcount, t.result_month
FROM sample_table t
INNER JOIN
( SELECT station
FROM sample_table
GROUP BY station
HAVING COUNT(DISTINCT result_month) =
(SELECT COUNT(DISTINCT result_month) FROM sample_table)
) t2
ON t2.station = t.station;
Example on SQL Fiddle
编辑
您的第二个要求有点不清楚,我不确定您想在什么时候将城市分组在一起,即您的数据是否如下:
(1, 'A','NewYork', 10, 'Jan'),
(2, 'B','NewYork', 10, 'Jan'),
(3, 'C','NewYork', 10, 'Jan'),
(4, 'A','NewYork', 10, 'Feb'),
(5, 'B','NewYork', 10, 'Feb'),
(6, 'A','NewYork', 10, 'Mar'),
(7, 'B','NewYork', 10, 'Mar');
总和是否应该包括电台C
,因为纽约每个月都有一个条目?所以一月份总共有 30 个。在这种情况下,您的查询将是:
SELECT t.City, SUM(t.reviewcount) AS reviewcount, t.result_month
FROM sample_table t
INNER JOIN
( SELECT City
FROM sample_table
GROUP BY City
HAVING COUNT(DISTINCT result_month) =
(SELECT COUNT(DISTINCT result_month) FROM sample_table)
) t2
ON t2.City = t.City
GROUP BY t.City, t.result_month;
Example on SQL Fiddle
还是应该只包括 A 和 B,因为这些电台每个月都有一个条目?所以 Jan 总共只有 20 个。您的查询将在其中
SELECT t.City, SUM(t.reviewcount) AS reviewcount, t.result_month
FROM sample_table t
INNER JOIN
( SELECT station
FROM sample_table
GROUP BY station
HAVING COUNT(DISTINCT result_month) =
(SELECT COUNT(DISTINCT result_month) FROM sample_table)
) t2
ON t2.station = t.station
GROUP BY t.City, t.result_month;
Example on SQL Fiddle
【讨论】:
这很有帮助。但是在将它与聚合器部分结合时我遇到了麻烦,我已经为你更新了问题。你能建议吗。 非常感谢。由于表格包含数百万个条目,如何优化表格? 取决于您进行的查询。我建议可能并索引station
和result_month
- 即CREATE INDEX IX_sampletable_station_resultmonth ON Sample_table (station, result_month)
【参考方案2】:
GROUP BY 子句用于根据某些分组标准汇总数据。对于第一个示例,我将基于 AdventureWork2012
数据库表中名为 Sales.SalesOrderDetail
的单个列对数据进行分组。这个例子和我的大部分例子都使用AdventureWorks2012
数据库。如果你想跟着。
http://academy.comingweek.com/sql-groupby-clause/
【讨论】:
以上是关于按多列分组以获取月份的常见条目的主要内容,如果未能解决你的问题,请参考以下文章