Как получить (год недели, номер недели) для набора даты - PullRequest
1 голос
/ 02 апреля 2020

Я хотел бы получить (год номера недели, номер недели) для набора дат.

В Impala SQL есть функция weekofyear, которая дает правильный номер недели:

select year('2018-12-31'), weekofyear('2018-12-31')

year('2018-12-31')|weekofyear('2018-12-31')|
------------------|------------------------|
              2018|                       1|

Но функция year не работает, если вы хотите заказать (год, номер недели) кортежи в строковом формате 'yyyyWwk'.

Есть ли удобный способ получить 'yyyyWwk на каждую дату? Дата 2018-12-31, указанная в приведенном выше примере, приведет к результату 2019W01.

. Это не работает:

select concat(cast(year(dt) as STRING),'W',lpad(cast(weekofyear(dt) as string),2,"0")) as wk, dt
  from (
select '2018-11-30' as dt 
union 
select '2018-12-31' as dt
union 
select '2019-01-31' as dt
       ) as t
 order by 1, 2;

, поскольку неправильно упорядочивает даты:

wk     |dt        |
-------|----------|
2018W01|2018-12-31|
2018W48|2018-11-30|
2019W05|2019-01-31|

Как получить "неделю-год" = 2019 на дату 2018-12-31?

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Если это просто проблема order by, то я предполагаю, что у вас есть какой-то запрос агрегации. Если это так, вы можете использовать:

order by min(datecol)

Это позволит правильно упорядочить общий запрос.

Тем не менее, если вы хотите получить информацию к week , тогда используйте date_trunc() вместо извлечения года и недели:

select date_trunc('week', '2018-12-31')
0 голосов
/ 02 апреля 2020

Вы можете использовать псевдонимы столбцов в предложении order by

select year(datecol) as yr, weekofyear(datecol) as wk
  from yourtable
 order by yr, wk

, так как функции year() и weekofyear() возвращают integer значений.

Псевдонимы разрешено на верхнем уровне предложений GROUP BY, HAVING и ORDER BY, например, псевдоним GROUP BY из документация

...