【问题标题】:Selecting rows which have a similar value for a particular column which occurs n times each month为每个月出现 n 次的特定列选择具有相似值的行
【发布时间】:2015-04-07 01:40:54
【问题描述】:

我有一个包含多个列的数据库,我从中创建了这个视图,其中有多个类似于下面显示的行。数据可用于 2009 年至 2010 年每月的每一天以及给出的 5 个名称的所有月份。我必须获取每个月出现“超级”类别超过 5 次的“名称”,并为每个月单独列出。该视图包含所有月份的数据。

Name  Dates      Category
--------------------------------
PAT  2009-01-01 Super
YAT  2009-01-01 No 
ROT  2009-01-01 No 
SUP  2009-01-01 Super 
ANT  2009-01-01 Super 

我尝试使用来计算 MySQL 中的名称数

SELECT `NAME`,`DATES` 
FROM (
        SELECT `NAME`, `CATEGORY`,MONTH(`DATES`)
        FROM VIEW
        GROUP BY `NAME`, `CATEGORY`,MONTH(`DATES`)
        HAVING COUNT(`CATEGORY`)>5 
    ) a
GROUP BY `NAME`
HAVING count(`CATEGORY`)>5;

但它不返回任何行。

【问题讨论】:

  • 如果在离开 HAVING COUNT(CATEGORY)>5 的同时运行查询会发生什么?你有什么收获吗?
  • @OllieJones 当我这样做时它会显示一条 mysql 语法错误消息。

标签: mysql date select conditional


【解决方案1】:

您正在尝试将行分组为月份。最好的方法是从一个表达式开始,该表达式将采用任何日期并将其转换为它发生月份的第一天。那个表情就是。

 DATE(DATE_FORMAT(dates, '%Y-%m-01'))

接下来,您在带有 GROUP BY 子句的查询中使用此表达式。

SELECT NAME, CATEGORY, 
       DATE(DATE_FORMAT(DATES, '%Y-%m-01')) DATES
  FROM VIEW
 GROUP BY NAME, CATEGORY, DATE(DATE_FORMAT(DATES, '%Y-%m-01'))
HAVING COUNT(*) > 5

这将产生出现五次以上的所有名称/类别/月份组合。

我想这就是你想要的。但也许您希望 all 列出在某个名称中 Super 类别出现超过五次的任何月份中列出的月度项目。为此,我们首先编写一个子查询来获取这些日期的列表:

            SELECT DATE(DATE_FORMAT(DATES, '%Y-%m-01')) DATES
              FROM VIEW
             WHERE CATEGORY = 'Super'
             GROUP BY NAME, DATE(DATE_FORMAT(DATES, '%Y-%m-01'))
            HAVING COUNT(*) > 5

然后我们编写一个主查询来获取所有数据

SELECT DISTINCT
       NAME, CATEGORY, 
       DATE(DATE_FORMAT(DATES, '%Y-%m-01')) DATES
  FROM VIEW
 WHERE DATE(DATE_FORMAT(DATES, '%Y-%m-01')) IN
        (
            SELECT DATE(DATE_FORMAT(DATES, '%Y-%m-01')) DATES
              FROM VIEW
             WHERE CATEGORY = 'Super'
             GROUP BY NAME, DATE(DATE_FORMAT(DATES, '%Y-%m-01'))
            HAVING COUNT(*) > 5
        )

让这种事情发挥作用的诀窍是选择正确的日期算术表达式以在您的GROUP BY 子句中使用。 DAY()MONTH()YEAR() 之类的函数很难正确使用,所以我想您可能会发现 DATE(DATE_FORMAT(dates, '%Y-%m-01')) 更可靠。

【讨论】:

    猜你喜欢
    • 2021-07-29
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多