#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 интервала, которые будут усреднены.