我应该有一些样本数据在里面 test_data
如下所示,每周有1-5天数据库中有数据(>=1天‘有数据’<=5天):
code vol val num test_date
--------------------------------------------
1 00001 100 0.1 111 20191104
2 00001 100 0.1 111 20191105
3 00001 100 0.1 111 20191106
4 00001 100 0.1 111 20191107
5 00001 100 0.1 111 20191108
7 00001 100 0.1 111 20191111
8 00001 200 0.1 222 20191112
9 00001 200 0.1 111 20191113
10 00001 400 0.3 222 20191114
11 00001 200 0.2 333 20191118
12 00002 100 0.1 111 20191104
13 00002 200 0.1 222 20191105
14 00002 200 0.1 111 20191106
15 00002 400 0.3 222 20191107
16 00002 200 0.2 333 20191108
....................
....................
我想总结一下 volume
, number
以及 value
按周/年和 code
,现在我可以通过下面的sql查询对它们进行汇总,但是我无法根据 test_date
,由于业务/工作日的关系,最后一天可能是一周或一年中的任何一天,我们需要显示最后一天列
SELECT t.code
,date_add(concat_ws('-',substr(t.test_date,1,4),substr(t.test_date,5,2),substr(t.test_date,7,2)) ,
-pmod(datediff(concat_ws('-',substr(t.test_date,1,4),substr(t.test_date,5,2),substr(t.test_date,7,2)),'1990-01-01'),7)) AS test_date
,sum(t.number) AS num
,sum(t.volume) AS vol
,sum(t.value) AS val
FROM test_data t
GROUP BY t.code, test_date
现在我的输出如下:
code vol val num test_date(monday)
----------------------------------------------------
1 00001 500 0.5 555 20191104
2 00001 900 0.6 666 20191111
3 00001 200 0.1 111 20191118
4 00001 400 0.3 222 20191125
5 00001 200 0.2 333 20191202
但我的预期产出如下:
code vol val num test_date(the last date of week in database)
-------------------------------------------------------------------------------
1 00001 500 0.5 555 20191108
2 00001 900 0.6 666 20191114
3 00001 200 0.1 111 20191122
4 00001 400 0.3 222 20191129
5 00001 200 0.2 333 20191206
非常感谢你的建议。
1条答案
按热度按时间nqwrtyyt1#
我认为以下是你想要的:
我只是简化了你的方程式,用一点公式来计算一周的第一天
TO_DATE
以及TRUNC
. 然后您只需选择test_date
对于本周最后一天存在数据的各组。如果你只想要一周的最后一天,不管是否有数据,只需要在开始的一天加上相应的天数。
TRUNC(TO_DATE(t.test_date,'RRRRMMDD'),'IW') + 6
星期天。