Jak obliczyć co ile dni, średnio, każdy pracownik przyjmuje kolejne zamówienie?

0

Witam, napisałem na razie to:
SELECT P.Imię+ ' ' + P.Nazwisko AS Pracownik, z.DataZamówienia
FROM Pracownicy p JOIN Zamówienia z ON p.IDpracownika=z.IDpracownika;
Tylko nie wiem jak obliczyć co ile dni, średnio, każdy pracownik przyjmuje kolejne zamówienie. Powyższy kod zwraca :
Zrzut ekranu 2023-11-28 144840.png
no i to się ciągnie dalej.
Tutaj jeszcze wklejam jak wygląda kolumna data zamówienia dla przykładowego 1 pracownika:
SELECT tab2.DataZamówienia, tab2.Pracownik
FROM (SELECT z.DataZamówienia, p.Imię+' '+p.Nazwisko AS Pracownik
FROM Pracownicy p JOIN Zamówienia z ON p.IDpracownika=z.IDpracownika
WHERE p.Imię='Margaret' AND p.Nazwisko='Peacock'
) AS tab2
ORDER BY tab2.DataZamówienia;
I kod zwraca to:
screenshot-20231128145128.png
oczywiście wyniki ciągną się w dół. Bardzo proszę o pomoc.

1

np. Obliczasz dystans w dniach pomiędzy kolejnymi zamówieniami a potem z tego liczysz średnią
albo różnica w dniach pomiędzy pierwszym a ostatnim podzielona na ilość zamówień -1

0
Marius.Maximus napisał(a):

np. Obliczasz dystans w dniach pomiędzy kolejnymi zamówieniami a potem z tego liczysz średnią
albo różnica w dniach pomiędzy pierwszym a ostatnim podzielona na ilość zamówień -1

Właśnie nad tym myślałem tylko jak obliczyć dystans pomiędzy kolejnymi zamówieniami? Nie mam pomysłu jak zapisać to w kodzie.

3

Wystarczy zagregować dane czyli wybrac minimalną i maksymalną datę i podzielić przez liczbę tych dat:

Select
	Pracownik
	,DATEDIFF(d,mindt,maxdt)/i srednia
FROM (
	SELECT
	  P.Imię+ ' ' + P.Nazwisko AS Pracownik
	  ,min(z.DataZamówienia) mindt
	  ,max(z.DataZamówienia) maxdt
	  ,count(*) i
	FROM 
		Pracownicy p 
		JOIN Zamówienia z ON p.IDpracownika=z.IDpracownika
    GROUP BY
        P.Imię+ ' ' + P.Nazwisko
	) dt
3

Wg mnie to co podał @Panczo jest prawie OK. Tylko należy podzielić nie przez i, a przez i-1. (poza tym, że brakuje GROUP BY, ale to MySQL, on wszystko łyka:) )
Dla przykładu dla pierwszych dwóch rekordów:
daty to '2008-09-08' i '2008-09-11' (są to zarówno min i max). Różnica pomiedzy tymi rekordami wynosi 3, a ilość rekordów to 2.
Więc z zapytania wynikałoby, że co 1.5 dnia otrzymują zamówienie.

Ja osobiście zrobiłbym to na funkcji okna - LAG.
Przykład poniżej: (oczywiście nieco zmodyfikowany po posgtresql)
http://sqlfiddle.com/#!15/af463/10

1 użytkowników online, w tym zalogowanych: 0, gości: 1