2009-07-21 7 views
3

J'ai une table contenant plusieurs enregistrements pour différentes transactions iESQL Pour trouver la différence entre plusieurs lignes

ID Date   REF 
1 01/09/2008 A 
1 11/09/2008 A 
1 01/10/2008 A 
2 01/09/2008 A 
2 01/10/2008 A 
2 01/11/2008 B 
2 01/12/2008 B 

et je suis à la recherche de résumer les données afin que je les jours en moyenne pour chaque id et ref. .. -à-dire

ID Ref Avg_Days 
1 A  15 
2 A  30 
2 B  30 

Merci à l'avance si quelqu'un peut aider

+0

S'il vous plaît essayez de reformater votre question pour mieux lire. Homme! Ça fait vraiment mal! – Galilyou

+0

A besoin de savoir quel type de SQL – Dave

+0

re formaté, des excuses. Microsoft SQL Server –

Répondre

3

différence de jour moyenne est SUM des différences divisées par COUNT(*)

SUM des différences est la différence de fait entre MIN et MAX:

SELECT id, ref, DATEDIFF(day, MIN(date), MAX(date))/NULLIF(COUNT(*) - 1, 0) 
FROM mytable 
GROUP BY 
     id, ref 
+0

@Quassnoi - c'est génial. J'ai modifié le code à SELECT id, ref, DATEDIFF (jour, MIN (date), MAX (date)), COUNT (*) FROM mytable GROUP BY id, réf comme dans mon exemple besoin de COUNT (*) - 1 lorsque COUNT (*)> 2 et COUNT (*) lorsque COUNT (*) = 2. Merci à tout le monde pour toute l'aide –

3

Quelque chose comme ça ... pas vraiment comment cette information vous aidera à quoi que ce soit e ough .... besoin de plus d'informations sur ce que vous essayez de faire la moyenne des jours.

SELECT ID, REF, AVG(DATEPART(day, [Date])) 
FROM dbo.Table1 
GROUP BY ID, REF 

Référence: AVG, DATEPART

3

En utilisant sql server 2005, essayez ceci.

DECLARE @Table TABLE(
     ID INT, 
     Date DATETIME, 
     Ref VARCHAR(MAX) 
) 

INSERT INTO @Table (ID,Date,Ref) SELECT 1, '01 Sep 2008', 'A' 
INSERT INTO @Table (ID,Date,Ref) SELECT 1, '11 Sep 2008', 'A' 
INSERT INTO @Table (ID,Date,Ref) SELECT 1, '01 Oct 2008', 'A' 
INSERT INTO @Table (ID,Date,Ref) SELECT 2, '01 Sep 2008', 'A' 
INSERT INTO @Table (ID,Date,Ref) SELECT 2, '01 Oct 2008', 'A' 
INSERT INTO @Table (ID,Date,Ref) SELECT 2, '01 Nov 2008', 'B' 
INSERT INTO @Table (ID,Date,Ref) SELECT 2, '01 Dec 2008', 'B' 


;WITH Ordered AS (
    SELECT ID, 
      Ref, 
      Date, 
      ROW_NUMBER() OVER (PARTITION BY ID, Ref ORDER BY Date) SubNumber 
    FROM @Table t 
) 
SELECT Ordered.ID, 
     Ordered.Ref, 
     AVG(DATEDIFF(dd, Ordered.Date, OrderedNext.Date)) AVG_Days 
FROM Ordered INNER JOIN 
     Ordered OrderedNext ON Ordered.ID = OrderedNext.ID 
          AND Ordered.Ref = OrderedNext.Ref 
          AND Ordered.SubNumber + 1 = OrderedNext.SubNumber 
GROUP BY Ordered.ID, 
     Ordered.Ref 

ont également un coup d'oeil mathématiquement:

Disons que

([X (1) -X (0)] + [X (2) -X (1)] + [X (3) -X (2)] + ... + [X (n-1) -X (n-2)] + [X (n) -X (n-1)])/(n- 1).

agrandir la partie supérieure comme

-X (0) + X (1) - X (1) + X (2) - X (2) + X (3) - ... - X (n-2) + X (n-1) - X (n-1) + X (n)

whcih finissent comme -X (0) + X (n)

nous avons donc [X (n) - X (0)]/(n - 1)

alors prenez (MAX - MIN)/(chef - 1) pour le nombre> 1

+0

+1 Nice one. ;) – AnthonyWJones

Questions connexes