SQL查询如何获取Oracle/Hive中week/year的最后一个工作日?

SQL query how to get the last working day of week/year in Oracle/Hive?

假设我在 test_data 中有一些样本数据如下,每周有 1-5 天的数据在数据库中(>=1 天 'There is data' <= 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
....................
....................

我想通过 week/year 和 code 总结 volumenumbervalue,现在我可以通过以下 SQL查询,但是我无法根据test_date得到一周的最后一天,因为business/working天,最后一天可能是一周或一年中的任何一天,我们需要显示最后一个日期列

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

非常感谢您的建议。

我想下面是你想要的:

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_DATETRUNC 缩短了你的方程式来计算一周的第一天。然后,您只需 select 每个组的 test_date 的最大值,这是本周的最后一天,其中存在数据。

如果您只想要一周的最后一天,而不管是否有数据,只需将相应的天数添加到开始日期,例如TRUNC(TO_DATE(t.test_date,'RRRRMMDD'),'IW') + 6 周日。