Вычисление средних дней между заказами по последним трем записям tsql

#sql #sql-server #datetime #greatest-n-per-group #date-arithmetic

#sql #sql-сервер #дата и время #наибольшее число на группу #дата-арифметика

Вопрос:

Я пытаюсь получить среднее значение для каждого клиента, но вы не группируете по клиентам. Я хотел бы рассчитать средние дни между несколькими датами заказа из таблицы с именем invoice. Для каждого BusinessPartnerID, сколько средних дней между заказами я хочу, чтобы средние дни последних трех записей записывали заказы. Я получил среднее значение по всем заказам для каждого пользователя, но мне нужны последние три записи заказоввведите описание изображения здесь. Примерная таблица выглядит следующим образом

    ;WITH temp (avg,invoiceid,carname,carid,fullname,mobail)
AS
(
    SELECT AvgLag = AVG(Lag)  , Lagged.idinvoice,
     Lagged.carname ,
     Lagged.carid ,Lagged.fullname,Lagged.mobail
FROM 
(
 SELECT   
  
  (car2.Name) as carname ,
    (car2.id) as carid ,( busin.Name) as fullname, ( busin.Mobile) as mobail , INV.Id as idinvoice , Lag = CONVERT(int, DATEDIFF(DAY, LAG(Date,1) 
    OVER (PARTITION BY car2.Id ORDER BY Date ), Date))
     FROM  [dbo].[Invoice]    AS    INV
    JOIN  [dbo].[InvoiceItem] AS INITEM  on INV.Id=INITEM.Invoiceid
    JOIN [dbo].[BusinessPartner]  as busin on busin.Id=INV.BuyerId and Type=5
    JOIN [dbo].[Product] as pt on pt.Id=INITEM.ProductId and  INITEM.ProductId is not null and  pt.ProductTypeId=3  
    JOIN [dbo].[Car] as car2 on car2.id=INv.BusinessPartnerCarId 
    
    
) AS Lagged 
 GROUP BY
  Lagged.carname,
 Lagged.carid,Lagged.fullname,Lagged.mobail, Lagged.idinvoice

 -- order by Lagged.fullname
  
  )
 SELECT  *  FROM temp  where avg is not null   order by avg  
  

Ответ №1:

Я действительно не понимаю, как ваш запрос связан с вашим вопросом. Начиная с таблицы, invoice которая имеет столбцы businesspartnerid , и date , вот как вы могли бы получить среднее значение разницы в днях между последними 3 счетами каждого бизнес-партнера:

 select businesspartnerid, 
    avg(1.0 * datediff(
        day, 
        lag(date) over(partition by businesspartnerid order by date),
        date
    ) avg_diff_day
from (
    select i.*,
        row_number() over(partiton by businesspartnerid order by date desc) rn
    from invoice i
) i
where rn <= 3
group by businesspartnerid
  

Обратите внимание, что 3 строки дают вам только 2 интервала, которые будут усреднены.