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
总结 volume
、number
和 value
,现在我可以通过以下 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_DATE
和 TRUNC
缩短了你的方程式来计算一周的第一天。然后,您只需 select 每个组的 test_date
的最大值,这是本周的最后一天,其中存在数据。
如果您只想要一周的最后一天,而不管是否有数据,只需将相应的天数添加到开始日期,例如TRUNC(TO_DATE(t.test_date,'RRRRMMDD'),'IW') + 6
周日。
假设我在 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
总结 volume
、number
和 value
,现在我可以通过以下 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_DATE
和 TRUNC
缩短了你的方程式来计算一周的第一天。然后,您只需 select 每个组的 test_date
的最大值,这是本周的最后一天,其中存在数据。
如果您只想要一周的最后一天,而不管是否有数据,只需将相应的天数添加到开始日期,例如TRUNC(TO_DATE(t.test_date,'RRRRMMDD'),'IW') + 6
周日。