Mam stolik dziecięcy, który jest mniej więcej taki:
[Tabela dat Cust]
| Customer ID | Some Date | Balance |
+-------------+------------+---------+
| 1 | 2012-04-30 | 20.00 |
| 1 | 2012-03-31 | 50.00 |
| 2 | 2012-04-30 | 0.00 |
| 2 | 2012-03-31 | 10.00 |
| 3 | 2012-03-31 | 60.00 |
| 3 | 2012-02-29 | 10.00 |
Chciałbym móc uzyskać taki zestaw wyników - jeden rekord dla każdego klienta z najnowszą datą:
| Customer ID | Some Date | Balance |
+-------------+------------+---------+
| 1 | 2012-04-30 | 20.00 |
| 2 | 2012-04-30 | 0.00 |
| 3 | 2012-03-31 | 60.00 |
Wiem, że mogę to zrobić dla każdego „Identyfikatora klienta” za pomocą następującej składni SQL (SQL Server):
select top 1 [Some Date], [Customer ID], [Balance]
from [Cust Date Table]
where [Customer ID] = 2
order by [Some Date] desc
| Customer ID | Some Date | Balance |
+-------------+------------+---------+
| 2 | 2012-04-30 | 0.00 |
Ale nie jestem pewien, jak uzyskać wszystkie trzy płyty, które chcę. Nie jestem pewien, czy jest to sytuacja, która wymaga pod-zapytania lub czegoś innego.
Należy pamiętać, że maksymalna data może być inna dla każdego [ID klienta] (w tym przykładzie maksymalna data klienta 3 to 31.03.2012, podczas gdy inne rekordy mają maksymalną datę 2012-04-30). próbowałem
select [Customer ID], MAX([Some Date]) AS [Latest Date], Balance
from [Cust Date Table]
group by [Customer ID], Balance;
Problem polega na tym, że nie zwraca tylko jednego wiersza dla każdego klienta - zwraca wiele wierszy.
źródło
Myślę, że szukasz czegoś takiego
Istnieje wiele odmian tego, tj. CTE, zmienna stołowa, #tabela, z którymi możesz się pobawić, aby zobaczyć, co daje najlepszą wydajność w twojej sytuacji.
źródło