Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何每周、每月从mysql获取给定日期范围组的数据_Mysql_Sql - Fatal编程技术网

如何每周、每月从mysql获取给定日期范围组的数据

如何每周、每月从mysql获取给定日期范围组的数据,mysql,sql,Mysql,Sql,我有一个表,其中包含以下格式的数据: id name cnt1 created_on '1','uac','116','2014-09-06 17:16:29' '2','uac','116','2014-09-06 17:17:06' '3','uac','90','2014-09-06 21:53:34' '4','uac','100','2014-08-06 21:53:34' '5','uac','1','2014-07-06 21:53:34' '6','uac','2','2014-

我有一个表,其中包含以下格式的数据:

id name cnt1 created_on
'1','uac','116','2014-09-06 17:16:29'
'2','uac','116','2014-09-06 17:17:06'
'3','uac','90','2014-09-06 21:53:34'
'4','uac','100','2014-08-06 21:53:34'
'5','uac','1','2014-07-06 21:53:34'
'6','uac','2','2014-07-26 21:53:34'
'7','uac','3','2014-09-01 21:53:34'
'8','uac','4','2014-09-02 21:53:34'
'9','uac','5','2014-09-03 21:53:34'
'10','uac','6','2014-09-04 21:53:34'
'11','uac','7','2014-09-05 21:53:34'
'12','uac','8','2014-09-07 21:53:34'
'13','uac','9','2014-09-08 21:53:34'
我希望给定日期范围的数据应按1分组。每周2。月刊 此外,我希望在一周或一个月内,我应该得到一周或一个月的最后一个数据。如 如果我得到每月的数据,我应该得到以下输出:

'6','uac','1','2014-07-26 21:53:34'
'4','uac','100','2014-08-06 21:53:34'
'13','uac','116','2014-09-08 21:53:34'
我试过这个问题

SELECT id,name,cnt1,created_on
FROM qa_dashboard.project_qa_coverage_detail
GROUP BY year(created_on), month(created_on);
但这给了我以下的输出

'5','uac','1','2014-07-06 21:53:34'
'4','uac','100','2014-08-06 21:53:34'
'1','uac','116','2014-09-06 17:16:29'

请帮助

您实际上并不需要一个
分组依据
查询。您希望获得每组的最后一行。这里有一个使用
的方法不存在

SELECT cd.*
FROM qa_dashboard.project_qa_coverage_detail cd
WHERE NOT EXISTS (SELECT 1
                  FROM qa_dashboard.project_qa_coverage_detail cd2
                  WHERE year(cd2.created_on) = year(cd.created_on) and
                        month(cd2.created_on) = month(cd.created_on) and
                        cd2.created_on > cd.created_on
                 ) ;
这实际上是在说:“从表中获取所有行,其中没有其他行具有相同的年份和月份,并且在日期创建了一个较新的
。”这是一种奇特的说法“获取每个月的最后一行。”

编辑

如果您需要当月第一个和最后一个日期的值,请改用
join
方法:

select cd.*, cdsum.minco as first_created_on
from qa_dashboard.project_qa_coverage_detail cd join
     (select year(cd2.created_on) as yr, month(cd2.created_on) as mon,
             min(cd2.created_on) as minco, max(cd2.created_on) as maxco
      from qa_dashboard.project_qa_coverage_detail cd2
      group by year(cd2.created_on), month(cd2.created_on)
     ) cdsum
     on cd.created_on = cd2.maxco;

这看起来像是预期的产出,每年和每月一行。您已在选择列表中将
created_on
指定为表达式,因此您将从每组中的一行中的
created_on
列中获取值

如果只想在输出中使用年和月,则需要在选择列表中使用不同的表达式。比如说,

DATE_FORMAT(created_on,'%Y-%m') AS yyyy_mm 
您可以在GROUPBY子句中使用相同的表达式,而不是两个单独的表达式

作为另一个选项,您可以在选择列表中使用
年(创建日期)、月(创建日期)


要按周“分组”行,可以使用
week(created_on)
代替
MONTH(created_on)


要返回每个组的“最后”行,通常的模式是使用内联视图和联接操作。例如:

SELECT t.id
     , t.project
     , t.total_tc
     , t.created_on
  FROM qa_dashboard.project_qa_coverage_detail t
  JOIN ( SELECT MAX(r.created_on)
           FROM qa_dashboard.project_qa_coverage_detail r
          GROUP BY DATE_FORMAT(r.created_on,'%Y-%m')
       ) s
    ON s.created_on = t.created

请注意,如果有两行(或更多行)在
值上创建了相同的
,则此查询可能会为组返回多行。

这将为您提供预期的输出:

持续一个月:

select t.*
  from tbl t
  join (select max(created_on) as last_for_month
          from tbl
         group by year(created_on), month(created_on)) v
    on t.created_on = v.last_for_month
select t.*
  from tbl t
  join (select max(created_on) as last_for_week
          from tbl
         group by year(created_on), week(created_on)) v
    on t.created_on = v.last_for_week
除非你说你期望:

'6','uac','1','2014-07-26 21:53:34'
我想你真正想要的是:

'6','uac','2','2014-07-26 21:53:34'
(基于您提供的样本数据)

小提琴:

持续一周:

select t.*
  from tbl t
  join (select max(created_on) as last_for_month
          from tbl
         group by year(created_on), month(created_on)) v
    on t.created_on = v.last_for_month
select t.*
  from tbl t
  join (select max(created_on) as last_for_week
          from tbl
         group by year(created_on), week(created_on)) v
    on t.created_on = v.last_for_week
根据您的评论,如果您想要当月最后一个月的最后一个值和最后一个id,但是想要当月第一个月的cnt1的值,请使用以下命令(如果您想要相同的值,但是想要周,请将month()更改为week()):

小提琴:

输出:

| ID |                 FIRST_CREATED_ON | CNT1 |
|----|----------------------------------|------|
|  4 |    August, 06 2014 21:53:34+0000 |  100 |
|  6 |      July, 06 2014 21:53:34+0000 |    2 |
| 13 | September, 01 2014 21:53:34+0000 |    9 |

当您使用
分组依据
时,如果您想对
cnt1
列中的值进行求和,则应指定。为什么cnt1栏中有116个用于2014年9月?它是所有值中的最大值吗?此外,我还错过了列表中的
cnt2
列值。为什么您的样本数据有两列名为CNT1和cnt2,但只有一个金额值存在,然后在您的查询中,您引用了一个名为“TOTAL_TC”的列,该列在您的样本中似乎不存在?您预期输出的第一行上的第三个值是否应该是2,不是1?我已经编辑了我的问题@VDohnal 116是单个值,不是最大值。我其实不需要总和或平均值。我只需要一周的最新数据/monhthanks@Gordon Linoff。工作完美,我同意标题重新因素。已经用光了:-)还有一个问题,如果我想将日期显示为该月/周的第一天,该怎么办。当前值是正确的,但日期是一周的最后一天/month@Pratik . . . 这个问题是指最后一天。对于第一天,将
更改为
changing>也更改值。我想显示周/月的第一天,但我不想更改值。它仍然应该显示last的值row@BrianDeMilia . . . 当然没用了。我在连接条件上使用空格。此查询给出语法错误。我遗漏了什么吗?您是否将“tbl”重命名为您的实际表格?它没有语法错误:啊,我的坏。力不从心。工作完美。我还有一个问题。当前显示的是周/月的最后一天。我们可以显示周/月的第一天,但我不想更改值。它仍然应该显示last的值row@Pratik我相信我已经做了你刚才描述的事情:。如果输出不是您期望的,请使用您实际需要的确切输出编辑您的问题。