Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zapytanie SQL, aby uzyskać najnowszą cenę

Myślę, że jedynym rozwiązaniem ze strukturą tabeli jest praca z podzapytaniem:

SELECT *
   FROM Thing
   WHERE ID IN (SELECT max(ID) FROM Thing 
                   WHERE ThingID IN (1,2,3,4)
                   GROUP BY ThingID)

(Najwyższy identyfikator oznacza również najnowszą cenę)

Sugeruję jednak dodanie kolumny „IsCurrent”, która ma wartość 0, jeśli nie jest to najnowsza cena, lub 1, jeśli jest najnowsza. Doda to potencjalne ryzyko niespójności danych, ale znacznie przyspieszy cały proces, gdy tabela będzie większa (jeśli jest w indeksie). Wtedy wszystko, co musisz zrobić, to...

SELECT *
   FROM Thing
   WHERE ThingID IN (1,2,3,4)
     AND IsCurrent = 1

AKTUALIZUJ

Dobra, Markus zaktualizował pytanie, aby pokazać, że ID jest unikalnym identyfikatorem, a nie int. To sprawia, że ​​pisanie zapytania jest jeszcze bardziej złożone.

SELECT T.* 
   FROM Thing T
   JOIN (SELECT ThingID, max(PriceDateTime)
            WHERE ThingID IN (1,2,3,4)
            GROUP BY ThingID) X ON X.ThingID = T.ThingID 
                                AND X.PriceDateTime = T.PriceDateTime
   WHERE ThingID IN (1,2,3,4)

Naprawdę sugerowałbym użycie kolumny „IsCurrent” lub skorzystanie z innej sugestii znalezionej w odpowiedziach i użycie tabeli „bieżąca cena” i oddzielnej tabeli „historia cen” (która ostatecznie byłaby najszybsza, ponieważ utrzymuje cenę sam stół jest mały).

(Wiem, że ThingID na dole jest zbędny. Po prostu spróbuj, czy jest szybszy z czy bez tego „GDZIE”. Nie jestem pewien, która wersja będzie szybsza po wykonaniu pracy przez optymalizator.)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Indeks na kolumnie bitowej

  2. Co to jest RAISERROR programu SQL Server?

  3. Wstaw datę i godzinę w SQL bez milisekund za pomocą parametru

  4. Jak wysłać wyniki zapytania e-mailem jako załącznik w SQL Server (T-SQL)

  5. Unikanie zakleszczenia za pomocą podpowiedzi NOLOCK