Welcome to Sign in | Help
in Search

select cu eliminare de randuri

Last post 06-18-2008, 11:39 AM by Daemian. 4 replies.
Sort Posts: Previous Next
  •  06-18-2008, 10:07 AM 5121

    select cu eliminare de randuri

    Salut

    Am o tabela care contine (printre altele) un camp ce poate lua doar 2 valori (sa zicem A si B). In aceasta tabela pot avea oricate inregistrari de A si/sau de B, cu conditia ca prima inregistrare sa fie A si nu pot exista 2 inregistrari consecutive de tip B. Tabela este ordonata crescator in functie de o data calendaristica. Ceva de genul:
    rand 1: A
    rand 2: A
    rand 3: B
    rand 4: A
    rand 5: B
    rand 6: A
    rand 7: A
    rand 8: A
    rand 9: B
    rand 10: A
    Din aceasta tabela, trebuie sa obtin toate randurile de B, primul rand de A si toate randurile de A care urmeaza imediat dupa B. Altfel spus, din exemplul dat de mine trebuie sa rezulte:
    rand 1
    rand 3
    rand 4
    rand 5
    rand 6
    rand 9
    rand 10

    Aveti vreo idee?
  •  06-18-2008, 10:51 AM 5122 in reply to 5121

    Re: select cu eliminare de randuri

    SQL 2000 sau 2005 ?

    Razvan
  •  06-18-2008, 11:11 AM 5123 in reply to 5122

    Re: select cu eliminare de randuri

    Să considerăm tabela şi datele de test de mai jos:

    CREATE TABLE Tabela (
        Data datetime PRIMARY KEY,
        Tip char(1) NOT NULL CHECK (Tip IN ('A','B'))
    )

    INSERT INTO Tabela VALUES ('20080101','A')
    INSERT INTO Tabela VALUES ('20080102','A')
    INSERT INTO Tabela VALUES ('20080103','B')
    INSERT INTO Tabela VALUES ('20080104','A')
    INSERT INTO Tabela VALUES ('20080205','B')
    INSERT INTO Tabela VALUES ('20080206','A')
    INSERT INTO Tabela VALUES ('20080207','A')
    INSERT INTO Tabela VALUES ('20080308','A')
    INSERT INTO Tabela VALUES ('20080309','B')
    INSERT INTO Tabela VALUES ('20080310','A')

    Dacă foloseşti SQL Server 2005, următorul query furnizează rezultatele dorite:

    WITH T AS (
        SELECT *, ROW_NUMBER() OVER (ORDER BY Data) n
        FROM Tabela
    )
    SELECT x.Data, x.Tip FROM T x
    LEFT JOIN T y ON x.n=y.n+1 AND y.Tip='B'
    WHERE x.Tip='B' OR y.Tip='B' OR x.n=1

    Răzvan
  •  06-18-2008, 11:14 AM 5124 in reply to 5123

    Re: select cu eliminare de randuri

    Dacă foloseşti SQL Server 2000, poţi utiliza următorul query:

    SELECT Data, Tip FROM Tabela x
    WHERE Data=(SELECT MIN(Data) FROM Tabela)
    OR Tip='B' OR (
        SELECT TOP 1 Tip FROM Tabela y
        WHERE y.Data<x.Data ORDER BY Data DESC
    )='B'

    De fapt, acest query pare a avea performanţe mai bune decât cel din mesajul precedent (presupunând că există un index pe coloana Data), aşa că îl recomand indiferent de versiune.

    Răzvan
  •  06-18-2008, 11:39 AM 5125 in reply to 5124

    Re: select cu eliminare de randuri

    Multumesc, face exact ceea ce vroiam eu. Si da... foloseam SQL 2005. Mersi inca o data pt ajutor.
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems