Welcome to Sign in | Help
in Search

Grupare dupa date in intervale diferite in functie de timpul dintre ele

Last post 06-11-2011, 7:46 PM by Gherry. 12 replies.
Sort Posts: Previous Next
  •  06-01-2011, 4:27 PM 8757

    Grupare dupa date in intervale diferite in functie de timpul dintre ele

    Am urmatoarea tabela:

    CREATE TABLE [dbo].[interval](
    [id] [bigint] NOT NULL,
    [start_date] [date] NOT NULL,
    [end_date] [date] NOT NULL,
    [name] [nvarchar](50) NOT NULL
    )

    si am urmatoarele date :

    insert into intervale(1,'2010-05-05','2010-12-12','aaa');
    insert into intervale(2,'2011-05-05','2011-12-12','aaa');
    insert into intervale(3,'2008-01-01','2009-05-05','aaa');
    insert into intervale(4,'2010-05-05','2010-12-12','bbb');
    As vrea sa fac o grupare dupa nume si in cazul in care intre doua intervale cu acelasi nume si data de inceput de la al doilea sa fie mai mica decat daca de sfarsit la primul + X luni.
    Intervalul pentru care as vrea sa fac gruparea sa fie de 10 luni.
    Cum as putea sa fac sa imi rezulte in urma query-ului urmatoarea grupare:
    grupul 1
    (1,'2010-05-05','2010-12-12','aaa');
    (2,'2011-05-05','2011-12-12','aaa');

    grupul 2
    (3,'2008-01-01','2009-05-05','aaa');

    grupul 3
    (4,'2010-05-05','2010-12-12','bbb');


  •  06-01-2011, 7:56 PM 8758 in reply to 8757

    Re: Grupare dupa date in intervale diferite in functie de timpul dintre ele

    Te rog reformuleaza conditiile. Nu te-am inteles bine.
  •  06-02-2011, 8:57 AM 8761 in reply to 8757

    Re: Grupare dupa date in intervale diferite in functie de timpul dintre ele

    Inca nu am un querry exact insa o sa incerc sa dau un raspuns in cursul zilei de azi.
  •  06-02-2011, 10:55 AM 8762 in reply to 8757

    Re: Grupare dupa date in intervale diferite in functie de timpul dintre ele

    CREATE TABLE [dbo].[interval](
    [id] [bigint] NOT NULL,
    [start_date] [date] NOT NULL,
    [end_date] [date] NOT NULL,
    [name] [nvarchar](50) NOT NULL
    );
    GO

    insert interval values (1,'2010-05-05','2010-12-12','aaa');
    insert interval values (2,'2011-05-05','2011-12-12','aaa');
    insert interval values (3,'2008-01-01','2009-05-05','aaa');
    insert interval values (4,'2010-05-05','2010-12-12','bbb');
    GO

    DECLARE  @delta TINYINT = 10;

    DECLARE  @Rezultate TABLE (ID1 BIGINT NOT NULL, ID2 BIGINT NOT NULL, GroupID INT IDENTITY(1,1));

    INSERT  @Rezultate(ID1, ID2)
    SELECT  I.id AS ID1
        ,II.id AS ID2
    FROM  interval I
    JOIN  interval II ON I.id <> II.id
    AND    I.name = II.name
    AND    I.end_date <= II.start_date
    AND    II.start_date <= DATEADD(MM, @delta, I.end_date)

    SELECT  i.*  
        ,r.GroupID
    FROM  @Rezultate r
    JOIN  interval i ON r.ID1 = i.id
    UNION ALL
    SELECT  i.*
        ,r.GroupID
    FROM  @Rezultate r
    JOIN  interval i ON r.ID2 = i.id
    UNION ALL
    SELECT  i.*
        ,(SELECT COUNT(*) FROM @Rezultate) + ROW_NUMBER()OVER(ORDER BY i.id) AS GroupID
    FROM  interval i
    WHERE  i.id NOT IN (SELECT r.ID1 FROM @Rezultate r)
    AND    i.id NOT IN (SELECT r.ID2 FROM @Rezultate r)


    Este posibil ca modul în care sunt generate valorile GroupID să necesite modificări deoarece
    în lipsa unor precizări am presupus că fiecare grup poate avea maxim două înregistrări.
  •  06-02-2011, 11:00 AM 8763 in reply to 8757

    Re: Grupare dupa date in intervale diferite in functie de timpul dintre ele

    ok, am revenit..

    in primul rand si inainte de orice altceva as vrea sa fac urmatoarea mentiune: din felul cum vrei sa afisezi tu datele banuiesc ca vrei sa le afisezi intr-un raport. (nu am mai facut rapoarte de mult asa ca nu stiu sa iti dau detalii in directia aia)

    eu am procedat in felul urmator:
    1. am redenumit coloanele end_date = ed si start_date=sd (ca sa imi fie mai usor sa editez queryul de mana)
    2. am creat 2 coloane calculate
    sdm =(datepart(year,[sd])*(12)+datepart(month,[sd])) -> start date months
    edm =(datepart(year,[ed])*(12)+datepart(month,[ed])) -> end date months
    (asta ca sa pot calcula diferenta de care ziceai)
    3.
    am facut queryul urmator:

    SELECT     TOP (100) PERCENT interval_1.id, interval_1.sd, interval_1.ed, interval_1.name, MIN(dbo.interval.id) AS groupId
    FROM         dbo.interval INNER JOIN
                          dbo.interval AS interval_1 ON dbo.interval.name = interval_1.name
    WHERE     (dbo.interval.edm + 10 - interval_1.sdm > 0) AND (dbo.interval.edm < interval_1.sdm) OR
                          (interval_1.edm + 10 - dbo.interval.sdm > 0) AND (interval_1.edm < dbo.interval.sdm) OR
                          (dbo.interval.id = interval_1.id)
    GROUP BY interval_1.id, interval_1.sd, interval_1.ed, interval_1.name

    rezultatele arata cam asa:

    id       sd                   ed          name  groupId
    1    2010-05-05    2010-12-12    aaa    1
    2    2011-05-05    2011-12-12    aaa    1
    3    2008-01-01    2009-05-05    aaa    3
    4    2010-05-05    2010-12-12    bbb    4

    daca am intuit bine la inceput si vrei pt un raport atunci groupId ar trebui sa iti permita sa faci afisarea respectiva

    daca nu am intuit corect atunci queryul asta ar trebui sa te ajute sa pornesti in directia in care vrei sa mergi.

    idea din spatele queryului e urmatoarea:
    - s-a facut un join pe nume ca sa pot calcula diferenta
    - am ps ultimul "or" (dbo.interval.id = interval_1.id) ca sa acopar grupurile 3 si 4
    - am facut restul conditiei (  (dbo.interval.edm + 10 - interval_1.sdm > 0) AND (dbo.interval.edm < interval_1.sdm) OR
                          (interval_1.edm + 10 - dbo.interval.sdm > 0) AND (interval_1.edm < dbo.interval.sdm)) ca sa acopar grupul 1
    - am facut gruparea
    - am scris "ecuatia" pt groupId ( MIN(dbo.interval.id) AS groupId)

    spor in continuare si sper sa iti fie de folos.


    PS: am lucrat pe MSSQL 2008
  •  06-10-2011, 11:28 AM 8769 in reply to 8763

    Re: Grupare dupa date in intervale diferite in functie de timpul dintre ele

    Multumesc pentru interesul si timpul acordat acum ma uit la ceea ce ai postat. Vreau ca un grup sa apara toate inregistrarile. de exemplu sa zicem ca avem mai multe produse facute in diferite date si au o data de valabilitate. Vreau sa grupez pentru fiecare nume de produs in unul sau mai multe grupuri in functie de conditia urmatoare: Daca pentru 2 inregistrari care le compar: data de inceput la al doilea - data de sfarsit de la primul este un interval mai mic de x luni. Si vreau sa fac asta din procedura stocata.
  •  06-10-2011, 11:29 AM 8770 in reply to 8758

    Re: Grupare dupa date in intervale diferite in functie de timpul dintre ele

    Am pus mai jos o reformulare.
  •  06-10-2011, 11:38 AM 8771 in reply to 8763

    Re: Grupare dupa date in intervale diferite in functie de timpul dintre ele

    @ Gherry , ai inteles f bine despre ceea ce am eu nevoie ,pare foarte ok rezolvarea propusa de tine,acum o sa o implementez

  •  06-10-2011, 12:06 PM 8772 in reply to 8762

    Re: Grupare dupa date in intervale diferite in functie de timpul dintre ele

    @ B_gd_n[ ]Sahlean la asa ceva ma gandisem si eu , un grup are mai multe intrari 1-*
  •  06-10-2011, 3:56 PM 8773 in reply to 8763

    Re: Grupare dupa date in intervale diferite in functie de timpul dintre ele

    @Gherry Din pacate daca sunt mai multe grupuri cu mai multe elemente , nu le grupeaza pe toate.
  •  06-10-2011, 4:14 PM 8774 in reply to 8773

    Re: Grupare dupa date in intervale diferite in functie de timpul dintre ele

    Dacă înregistrările sursă sunt următoarele:
    1 AAA 2011-02-01 2011-02-28
    2 AAA 2011-04-01 2011-04-28
    3 AAA 2011-03-01 2011-05-28
    4 AAA 2011-06-01 2011-08-28
    5 AAA 2011-01-01 2011-04-28
    atunci cum trebuiesc ordonate/grupate ?

    De exemplu: criteriul amintit de către tine (diferența în luni <= 10) îmi permite să grupez înregistrările de mai sus în mai multe variante:
    5
    4
    sau
    5
    2
    4
    sau
    1
    3
    2
    4

  •  06-10-2011, 4:37 PM 8775 in reply to 8774

    Re: Grupare dupa date in intervale diferite in functie de timpul dintre ele

    5-4 grup 1,
    1-3 grup 2,
    2 grup 3 in ordinea crescatoare a datelor de inceput
  •  06-11-2011, 7:46 PM 8776 in reply to 8773

    Re: Grupare dupa date in intervale diferite in functie de timpul dintre ele

    posteaza te rog un set mai mare de date si o sa arunc o privire peste ele (daca se poate macar 10-20 de recorduri ar fi util)

View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems