Как использовать DATEDIFF с оконной функцией в SQL

Когда я запускаю следующий запрос:

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 

Но мне интересно, есть ли лучший способ сделать это?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы поместили окно за пределы 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

Другие вопросы по теме