sql查询如何在oracle/hive中获取周/年的最后一个工作日?

qni6mghb  于 2021-06-25  发布在  Hive
关注(0)|答案(1)|浏览(646)

我应该有一些样本数据在里面 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

非常感谢你的建议。

nqwrtyyt

nqwrtyyt1#

我认为以下是你想要的:

SELECT t.code
     , max(t.test_date) 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, TRUNC(TO_DATE(t.test_date,'RRRRMMDD'),'IW')

我只是简化了你的方程式,用一点公式来计算一周的第一天 TO_DATE 以及 TRUNC . 然后您只需选择 test_date 对于本周最后一天存在数据的各组。
如果你只想要一周的最后一天,不管是否有数据,只需要在开始的一天加上相应的天数。 TRUNC(TO_DATE(t.test_date,'RRRRMMDD'),'IW') + 6 星期天。

相关问题