Mysql按7天间隔选择查询组

时间:2017-03-27 12:24:49

标签: mysql

我正在尝试将数据分组7天。

例如,

我有一个数据,你可以在下面找到它。

count   startDate          finish_date         
1247    2017-03-09 08:43:18 2017-03-09 16:05:34
1681    2017-03-10 08:30:13 2017-03-10 16:31:55
1464    2017-03-11 08:36:50 2017-03-11 16:42:03
1343    2017-03-12 08:26:57 2017-03-12 16:39:58
1333    2017-03-13 08:35:34 2017-03-13 16:26:18
1215    2017-03-14 08:36:58 2017-03-14 16:13:20
1817    2017-03-16 08:24:49 2017-03-16 17:18:19
1675    2017-03-17 08:22:30 2017-03-17 16:36:58
1546    2017-03-18 08:33:52 2017-03-18 16:51:52
1443    2017-03-20 08:11:00 2017-03-20 16:26:38
1481    2017-03-21 08:26:04 2017-03-21 16:57:30
1574    2017-03-23 08:19:07 2017-03-23 16:12:46
1270    2017-03-24 08:25:25 2017-03-24 16:37:59
1765    2017-03-25 08:22:58 2017-03-25 16:44:24
1200    2017-03-26 08:37:47 2017-03-26 14:59:51
1479    2017-03-27 08:17:50 2017-03-27 15:18:32

我想把他们分组7天。 我试过这个。为了它。

select count(*), min(locationDate) as startDate, max(locationDate) as finish_date from location where tagCode = 24901 and xLocation >= 278 and xLocation <= 354 and yLocation >= 239 and yLocation <= 426 and locationDate
>= DATE_SUB('2017-03-01 00:00:01',INTERVAL 7 day) and locationDate <= '2017-03-27 23:59:59' group by DATEDIFF(locationDate, '2017-03-01 00:00:01') div 7

数据就像。

count   startDate          finish_date         
8283    2017-03-09 08:43:18 2017-03-14 16:13:20
7962    2017-03-16 08:24:49 2017-03-21 16:57:30
7291    2017-03-23 08:19:07 2017-03-27 15:22:05

问题是第二周它必须从2017-03-15开始,第三周需要开始2017-03-22但由于没有数据在几天没有开始我怎么能解决它?

3 个答案:

答案 0 :(得分:1)

正如我在评论中提到的那样,我认为你写的结果对你提供的输入很好,但不会有不同的输入(比如2017-03-15而不是{{1} })。

解决方案可能是编写类似这样的查询

2017-03-16

我在输入的简化版本上测试了这个的简化版本,可能存在拼写错误......

修改

要显示间隔开始日期和结束日期,请尝试使用此

select  sum(count) as count, min(location_date), max(location_date)
from    (
            select  t1.location_date,
                    t1.count,
                    date_sub(location_date, interval (datediff(t1.location_date, t2.min_date) % 7) day) week_start
            from    location t1
            cross join
                    (select min(location_date) as min_date from location) t2
            where   t1.tagCode = 24901 and
                    t1.xLocation between 278 and 354 and
                    t1.yLocation between 239 and 426 and
                    t1.locationDate >= DATE_SUB('2017-03-01 00:00:01',INTERVAL 7 day) and
                    t1.locationDate <= '2017-03-27 23:59:59'
                    ) t3
group by week_start

答案 1 :(得分:0)

我认为你可以这样做:  您需要更改查询结果:

1   1247    2017-03-09 08:43:18 2017-03-09 16:05:34
2   1681    2017-03-10 08:30:13 2017-03-10 16:31:55
3   1464    2017-03-11 08:36:50 2017-03-11 16:42:03
4   1343    2017-03-12 08:26:57 2017-03-12 16:39:58
5   1333    2017-03-13 08:35:34 2017-03-13 16:26:18
6   1215    2017-03-14 08:36:58 2017-03-14 16:13:20
7   1817    2017-03-16 08:24:49 2017-03-16 17:18:19
8   1675    2017-03-17 08:22:30 2017-03-17 16:36:58
9   1546    2017-03-18 08:33:52 2017-03-18 16:51:52
10  1443    2017-03-20 08:11:00 2017-03-20 16:26:38
11  1481    2017-03-21 08:26:04 2017-03-21 16:57:30
12  1574    2017-03-23 08:19:07 2017-03-23 16:12:46
13  1270    2017-03-24 08:25:25 2017-03-24 16:37:59
14  1765    2017-03-25 08:22:58 2017-03-25 16:44:24
15  1200    2017-03-26 08:37:47 2017-03-26 14:59:51
16  1479    2017-03-27 08:17:50 2017-03-27 15:18:32

to this使用计算第一行最大日期和最小日期之间天数的逻辑:

           --  max date of the row          min date of the first row
select FLOOR(datediff('2017-03-12 16:05:34', '2017-03-09 08:43:18')/7);

select  FLOOR( datediff('2017-03-16 17:18:19', '2017-03-09 08:43:18')/7);

 -- what is important that you always compute the max date - the min date of the first row the same row like in your example is : '2017-03-09 08:43:18'
select  FLOOR( datediff(max_date, '2017-03-09 08:43:18')/7);

    rec_sum     min_date            max_date            day_diff
1   1247    2017-03-09 08:43:18 2017-03-09 16:05:34   0
2   1681    2017-03-10 08:30:13 2017-03-10 16:31:55   0
3   1464    2017-03-11 08:36:50 2017-03-11 16:42:03   0
4   1343    2017-03-12 08:26:57 2017-03-12 16:39:58   0
5   1333    2017-03-13 08:35:34 2017-03-13 16:26:18   0
6   1215    2017-03-14 08:36:58 2017-03-14 16:13:20   0
7   1817    2017-03-16 08:24:49 2017-03-16 17:18:19   1
8   1675    2017-03-17 08:22:30 2017-03-17 16:36:58   1
9   1546    2017-03-18 08:33:52 2017-03-18 16:51:52   1
10  1443    2017-03-20 08:11:00 2017-03-20 16:26:38   1
11  1481    2017-03-21 08:26:04 2017-03-21 16:57:30   1
12  1574    2017-03-23 08:19:07 2017-03-23 16:12:46   2
13  1270    2017-03-24 08:25:25 2017-03-24 16:37:59   2
14  1765    2017-03-25 08:22:58 2017-03-25 16:44:24   2
15  1200    2017-03-26 08:37:47 2017-03-26 14:59:51   2
16  1479    2017-03-27 08:17:50 2017-03-27 15:18:32   2

-- now you can group the new result by the new field the result of division.

select 
      sum(rec_sum) ,
      min(min_date),
      max(max_date)
from (query result in the previous list)
group by day_diff 

i know it's a little bit hard but i think you can do it the hard way is the day_diff computing .

答案 2 :(得分:0)

我只使用GROUP BY DATE_FORMAT:

SELECT someTimeStamp,SUM(amount) AS Total FROM sometable WHERE 1 GROUP BY DATE_FORMAT(someTimeStamp,"%Y%v")