2013-08-09 11 views
5

W ramach mojego programu audytuję dane przychodzące, które mogą mieć 4 typy. Jeśli dane spełniają wszystkie wymagane kryteria, zostanie zapisany z powodzeniem w kolumnie tabeli, wraz z typem wiadomości i znacznikiem czasu, kiedy wiersz został wprowadzony do tabeli.SQL - zwracanie różnych wierszy dla danych z wartością Max utworzonego znacznika czasu

Dane mogą być również zapisywane do tabeli z błędem, z powodu np. Problemu z połączeniem itp. Z audytem. Program spróbuje ponownie przeprowadzić inspekcję tych danych, a jeśli powiodą się, napisze nowy wiersz z powodzeniem. Więc widzisz, że mam teraz 2 wiersze dla tej konkretnej wiadomości danych, jedna ma sukces, a druga ma błąd, oba z różnymi znacznikami czasu. (Sukces ma najnowszy znacznik czasu niż rekord błędu.)

Trzecia wiadomość, odrzucona, występuje i ma zapisany rekord, jeśli przychodzące dane nie spełniają wymaganego standardu, ponownie z utworzeniem znacznika czasu.

Co chcę zrobić, to napisać zapytanie SQL Sybase, aby pobrać tylko rekord dla każdej odebranej wiadomości, z najwyższym znacznikiem czasu.

Tak więc z powyższym przykładem błędu, nie chcę zwrócić rekordu błędu, tylko odpowiadający mu rekord sukcesu, od momentu, w którym proces został powtórzony i zakończył się sukcesem.

myślałem o czymś takim następujące ..

SELECT distinct(*) 
    FROM auditingTable 
     WHERE timestamp = (SELECT MAX(timestamp) from auditingTable) 

chociaż jestem świadomy to przyniesie z powrotem tylko 1 rekord, z najwyższym datownik w całej tabeli.

W jaki sposób mogę uzyskać najnowszy rekord każdej otrzymanej wiadomości, niezależnie od jej statusu?

Wszelkie pomysły mile widziane!

Odpowiedz

4

chcę zwrócić uwagę, że prosta modyfikacja zapytania pozwala robić to, co chcesz (chociaż wolę metodę row_number() w odpowiedzi Valex). Oznacza to odwrócenie podzapytania w klauzuli where do podzapytania skorelowane:

SELECT * 
FROM auditingTable at1 
WHERE timestamp = (SELECT MAX(timestamp) 
        from auditingTable at2 
        where at1.MessageId = at2.MessageId 
       ); 

Jest to standardowy SQL i powinien działać w każdej wersji Sybase.

0

Zalecam dodanie pola klucza podstawowego z automatyczną inkrementacją do auditingTable, aby łatwiej identyfikować rekordy. W poniższym zapytaniu założę, że dodałeś tę kolumnę i nazwał ją auditRecordId.

Zakładając, że jesteś identyfikujący każdą wiadomość przez messageType następnie dodaje powinno działać:

SELECT  A1.messageType, 
      A1.message 
FROM  auditingTable A1 
INNER JOIN (
       SELECT  MAX(auditRecordId) auditRecordId, 
          messageType 
       FROM  auditingTable 
       GROUP BY messageType 
      ) A2 ON A1.auditRecordId = A2.auditRecordId 
5

Nie wspomniano wersję Sybase. Można użyć ROW_NUMBER() function

Na przykład tabela ma MessageId, MessageTime pola można użyć następującego zapytania:

SELECT * FROM 
(
    SELECT auditingTable.*, 
    ROW_NUMBER() OVER (PARTITION BY MessageID ORDER BY MessageTime DESC) as RN 
    FROM auditingTable 
) as T 
WHERE RN=1; 
Powiązane problemy