【问题标题】:MySQL: group by date RANGE?MySQL:按日期范围分组?
【发布时间】:2010-10-31 10:14:01
【问题描述】:

好的,我有这个查询可以很好地将 2 列组合在一起:

SELECT search_query_keyword, search_query_date, COUNT(1) as count
            FROM search_queries 
            WHERE search_query_date >= '.$from.' AND search_query_date <= '.$to.'
            GROUP BY search_query_keyword, search_query_date
            ORDER BY count DESC
            LIMIT 10

但是,如果我想按日期范围而不是仅按日期分组怎么办?有没有办法做到这一点?

谢谢!

编辑:好的,这些答案非常复杂,我认为我想要的可以更容易实现,所以让我重新解释一下。例如,我想在一段时间内选择关键字 ">= 20090601 AND

keyword: foo
keyword: foo
keyword: foo
keyword: bar
keyword: bar

我会得到:

keyword: foo, count: 3
keyword: bar, count: 2

【问题讨论】:

  • 无论安全上下文如何,看到内联变量都会让我很痛。占位符是你的朋友。
  • 这取决于您的语言和数据库客户端库。谷歌你的图书馆的名称和“占位符”。

标签: mysql group-by


【解决方案1】:

我不太确定日期范围分组——你必须定义你想要的日期范围,然后也许你可以联合这些查询:

SELECT 
    'Range 1' AS 'date_range',
    search_query_keyword
FROM search_queries
WHERE search_query_date >= '.$fromRange1.' AND search_query_date <= '.$toRange1.'
UNION
SELECT 
    'Range 2' AS 'date_range',
    search_query_keyword
FROM search_queries
WHERE search_query_date >= '.$fromRange2.' AND search_query_date <= '.$toRange2.'
GROUP BY 1,2

或者,如果您想将它们放入一个包含多少天的分组中,例如“30 天、60 天等”,您可以这样做:

SELECT 
    (DATEDIFF(search_query_date, NOW()) / 30) AS date_group,
    search_query_keyword
FROM search_queries
GROUP BY date_group, search_query_keyword

编辑:根据您提供的进一步信息,此查询应该产生您想要的:

SELECT 
    search_query_keyword,
    COUNT(search_query_keyword) AS keyword_count
FROM search_queries
WHERE search_query_date >= '.$from.' AND search_query_date <= '.$to.'
GROUP BY search_query_keyword

【讨论】:

  • 有没有办法修改最后一个查询以跨越多个 search_query_date 范围?在这种情况下,返回的列将是 (keyword, column, week) 并且您可以运行查询以返回过去 6 周的结果?
【解决方案2】:

您可以对 CASE 语句或函数的结果进行分组。例如:

SELECT search_query_keyword, QUARTER(search_query_date), COUNT(1) as count
FROM search_queries 
WHERE search_query_date >= '.$from.' AND search_query_date <= '.$to.'
GROUP BY search_query_keyword, QUARTER(search_query_date)
ORDER BY count DESC

【讨论】:

【解决方案3】:

查看不同的基于 DATE 的函数并在此基础上构建,例如

select  YEAR( of your date ) + MONTH( of your date ) as ByYrMonth

但上述情况下的结果需要转换为字符,以防止 2009 年 + 1 月(第 1 个月)= 2010 年也被错误地与 2008 年 + 2 月(第 2 个月)= 2010 等分组......您的字符串最终应该是这样的:

...
200811
200812
200901
200902
200903
...

如果您想要按日历季度计算,则必须将(月 -1)的整数除以 4,所以...

Jan (-1) = 0 / 4 = 0
Feb (-1) = 1 / 4 = 0
Mar (-1) = 2 / 4 = 0
Apr (-1) = 3 / 4 = 0
May (-1) = 4 / 4 = 1
June (-1)= 5 / 4 = 1 ... etc...

是的,前面的示例明确引用了处理更好的 QUARTER() 函数,但如果也基于老化,例如 30、60、90 天,您可以应用上面类似的数学,但除以 30 为您的组。

【讨论】:

    猜你喜欢
    • 2019-02-14
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 2021-11-16
    • 2016-04-15
    相关资源
    最近更新 更多