Zapytanie SQL distinct + data ostatniego wystąpienia

0

Mam dane jak na poniższym zdjęciu. Nie mogę ugryźć tego. :-|

Potrzebuje najpierw zrobić distincta na ev_msg. Z tym nie ma problemu.

Problem tylko leży w tym że po wybraniu takich wierszy musze do nich jakoś dopiąć ev_Data ale ostatnie występujące po dacie (najnowsze).

Efektem powinny być wiersze w tym przypadku oznaczone na czerwono bo są to informacje z loga błędu niepowtarzające się i z datą najnowszą.

Najlepiej aby przy danym niepowtarzalnym błędzie była podana data min i data max kiedy błąd został zarejestrowany - ale to już szczyt marzeń.

Wszelkie grupowanie po polu ev_msg które ma format tekstowy też nie jest łatwe. Używam konwersji tego pola do nvarchar(max).

Taki skrypt lata na bazie co 15min i wysyła błędy na maila ale to już mam ogarnięte.

https://zapodaj.net/80cb6336c5823.jpg.html

0
Select 
    ev_msg
    , min(ev_Data)
    , max(ev_Data)
from
    tb
group by
    ev_msg
0
Panczo napisał(a):
Select 
    ev_msg
    , min(ev_Data)
    , max(ev_Data)
from
    tb
group by
    ev_msg

Dzięki. Zrobiłem tak

select 
    convert(nvarchar(max), ev_Msg )
    , min(ev_Data)
    , max(ev_Data)
from
    [emow2s].[dbo].[EventLog]
group by
    ev_msg

ale cały czas wywala błąd z polem ev_msg

The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.

0

musisz zrobić tego konwerta w group by.

select
convert(nvarchar(max), ev_Msg )
, min(ev_Data)
, max(ev_Data)
from
[emow2s].[dbo].[EventLog]
group by
convert(nvarchar(max), ev_Msg )

Serio potrzebujesz typu text w tym polu?

0
Panczo napisał(a):

musisz zrobić tego konwerta w group by.

select
convert(nvarchar(max), ev_Msg )
, min(ev_Data)
, max(ev_Data)
from
[emow2s].[dbo].[EventLog]
group by
convert(nvarchar(max), ev_Msg )

Serio potrzebujesz typu text w tym polu?

Serdecznie ci dziękuje Panczo. Działa tak jak powinno. Typu danych tego pola ja nie wymyśliłem a dostawca softu który wrzuca tam dane.

Finalna wersja dla potomnych (dodałem warunek na czas dla ostatnich 15min)

select 
    convert(nvarchar(max), ev_Msg ) as ev_msg
    , min(ev_Data) as ev_Data_min
    , max(ev_Data) as ev_Data_max
from
    [emow2s].[dbo].[EventLog]
where ev_Data > dateadd(n,-15,getdate())
group by
    convert(nvarchar(max), ev_Msg )
order by ev_Data_max desc,ev_msg

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