Wybrane dane z zapytania za pomocą TOP (1) i max ()

0

Witam,

mam tabelę z poniższymi danymi:
|Rodzaj| |Numer| |Licznik|
|AAAA| |AAAA/1| |1|
|AAAA| |AAAA/2| |2|
|BBBB| |BBBB/1| |1|
|BBBB| |BBBB/2| |2|
|BBBB| |BBBB/3| |3|
|CCCC| |CCCC/1| |1|

chcę tak napisać zapytanie żeby otrzymać wynik z ostatnim numerem dla danego rodzaju:
Rodzaj Numer
AAAA AAAA/1
BBBB BBBB/3
CCCC CCCC/1

próbowałem, ale nie wiem jak to dokończyć, dla jednego rodzaju działa ten kod

SELECT TOP 1 Rodzaj, Numer

FROM dbo.testy

WHERE ...

ORDER BY Licznik DESC

3

Coś się pomyliłeś z danymi bo powinienes dosta AAA/2

Możeż uzyć row number:

select * from (select * , row_number() over (partition by rodzaj order by licznik desc) r from test) t where r = 1
0

A nie wystarczy

SELECT Rodzaj, MAX(Numer) FROM dbo.testy GROUP BY Rodzaj

?

// edit: ok nie zadziała dla liczb o różnej długości - takie "11" będzie niżej niż "9" chyba że liczby są wyrównane zerami albo licznik nigdy nie przekracza 9, jednak trzeba użyć podzapytań lub partition.
Chyba że Numer to faktycznie sklejka z Rodzaj + Licznik, wtedy można olać tę kolumnę i sobie ją wyliczyć samemu

SELECT Rodzaj, CONCAT(Rodzaj, '/', MAX(Licznik)) as Numer FROM dbo.testy GROUP BY Rodzaj
0

No niekoniecznie, co jak pierwszy będzie B a ostatni A?

0

co? Z tego co pokazał OP to Numer = Rodzaj + '/' + Licznik

0

No max z a i b da a, więc nie zwróci oczekiwanego rezultatu. Dane są przykładowe i nie wiem czy to w celu pokazania problemu czy faktycznie ma tak to w bazie

0

no nie wiem, ale masz trochę racji bo porównywanie po stringach nie zadziała dla liczb o różnej długości - takie "11" będzie niżej niż "9" chyba że liczby są wyrównane zerami albo licznik nigdy nie przekracza 9

0

Super działa, licznik to tak naprawdę pole do numeracji dokumentów w bazie typu INT, ale nie chciałem tego komplikować, może źle przez to zadałem pytanie, to rozwiazanie działa, nie wpadłem na to żeby połaczyć zapytanie skorelowane i over partition, dziękuję za pomoc

Wersja z GROUP BY działa, ale tylko dla określenia samego ostatniego nr w liczniku, a ja chciałem oprócz tego otrzymać Numer, po dodaniu pola Numer , gupowanie po liczniku i numerach nie daje juz ostatniego dokumentu dla danego rodzaju.

Wersja z over partition i skorelowaniem działa już dobrze.

0

Można też z max

select 
    tab.*
from
    tab
    inner join (select 
                    rodzaj
                    , max(licznik) l 
                from 
                    tab
                group by
                    rodzaj) m on m.rodzaj=tab.rodzaj and m.l=tab.licznik
0

2 wersja też działa, jeszcze raz dzięki.

PS. przypomniałem sobie jeszcze o CTE i napisałem 3 wersję i też działa, a ktora wg Was jest najbardziej optymalna ?

WITH m as (select 
                    rodzaj
                    , max(licznik) l 
                from 
                    tab
                group by
                    rodzaj)
select 
    tab.*
from
    tab
    inner join m on m.rodzaj=tab.rodzaj and m.l=tab.licznik
0

Moze tak : SELECT MAX(Numer) numer,rodzaj, MAX(licznik) licznik FROM TBLN GROUP BY rodzaj --order by Licznik

0
EmeJERZY napisał(a):

Moze tak : SELECT MAX(Numer) numer,rodzaj, MAX(licznik) licznik FROM TBLN GROUP BY rodzaj --order by Licznik

Też działa :)

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