Когда я запускаю следующий запрос:
select
post_visid_high || ':' || post_visid_low as visitor_id
, datediff(minute, lag(date_time), date_time) over (partition by visitor_id order by date_time asc)
from adobe_data
я получил
Invalid function type [DATEDIFF] for window function.
Invalid function type [TIMEDIFF] for window function.
Я могу переписать запрос как
select
post_visid_high || ':' || post_visid_low as visitor_id
, lag(date_time) over (partition by visitor_id order by date_time asc) as previous_date
, datediff(minute, previous_date, date_time) as difference_in_minutes
from adobe_data
Но мне интересно, есть ли лучший способ сделать это?
Вы поместили окно за пределы datediff, но оно должно быть за пределами задержки.
datediff(minute, lag(date_time), date_time) over (partition by visitor_id order by date_time asc)
Становится...
datediff(minute, lag(date_time) over (partition by visitor_id order by date_time asc), date_time)
Кроме того, длинный узкий код легче читать и проверять, чем короткий мудрый код...
datediff(
minute,
lag(date_time) over (partition by visitor_id order by date_time asc),
date_time
)
Или даже...
datediff(
minute,
lag(date_time) over (
partition by visitor_id
order by date_time asc
),
date_time
)
Это также более удобно для инструментов сравнения, например, используемых git.
Проблема заключается в размещении ()
:
select
post_visid_high || ':' || post_visid_low as visitor_id
, datediff(minute, lag(date_time), date_time) over (partition by visitor_id
order by date_time asc)
from adobe_data
=>
select
post_visid_high || ':' || post_visid_low as visitor_id
, datediff(minute, lag(date_time) over (partition by visitor_id
order by date_time asc), date_time)
from adobe_data