Mam tabelę, która przechowuje różne statusy każdej transakcji. Każda transakcja może mieć wiele statusów (oczekująca, odrzucona, zatwierdzona itp.).

Muszę zbudować zapytanie, które podaje tylko ostatni status każdej transakcji.

Definicja tabeli przechowującej statusy to:

[dbo].[Cuotas_Estado]
ID int (PK)
IdCuota int          (references table dbo.Cuotas - FK)
IdEstado int         (references table dbo.Estados - FK)

Oto architektura trzech tabel:

arch

Wykonując prostą instrukcję SELECT na tabeli dbo.Cuotas_Estado, otrzymasz:

SELECT
    *
FROM [dbo].[Cuotas_Estado] [E]

sel1

Ale wynik, którego potrzebuję, to:

IdCuota    | IdEstado
2          | 1
3          | 2
9          | 3
10         | 3
11         | 4

Uruchamiam następującą instrukcję select:

SELECT
    DISTINCT([E].[IdEstado]),
    [E].[IdCuota]
FROM [dbo].[Cuotas_Estado] [E]
ORDER BY
    [E].[IdCuota] ASC;

To przyniesie taki wynik:

enter image description here

Tak więc, jak widać, wprowadza podwójną wartość do pozycji 9 i 11, potrzebuję zapytania, aby uzyskać tylko najnowszą kolumnę IdEstado (3 we wpisie 9 i 4 we wpisie 11).

0
epaezr 25 marzec 2020, 22:53

2 odpowiedzi

Najlepsza odpowiedź

Możesz tego spróbować?

with cte as (
    select IdEstado,IdCuota,
           row_number() over(partition by IdCuota order by fecha desc) as RowNum
        from [dbo].[Cuotas_Estado]
)
select IdEstado,IdCuota
    from cte
    where RowNum = 1
2
AswinRajaram 25 marzec 2020, 20:22

Możesz użyć skorelowanego podzapytania:

SELECT e.*
FROM [dbo].[Cuotas_Estado] e
WHERE e.IdEstado = (SELECT MAX(e2.IdEstado)
                    FROM [dbo].[Cuotas_Estado] e2
                    WHERE e2.IdCuota = e.IdCuota
                   );

W przypadku indeksu na Cuotas_Estado(IdCuota, IdEstado) jest to prawdopodobnie najbardziej wydajna metoda.

1
Gordon Linoff 25 marzec 2020, 20:13