Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Consulta SQL para obter o preço mais recente


Acho que a única solução com sua estrutura de tabela é trabalhar com uma subconsulta:
SELECT *
   FROM Thing
   WHERE ID IN (SELECT max(ID) FROM Thing 
                   WHERE ThingID IN (1,2,3,4)
                   GROUP BY ThingID)

(Dado o ID mais alto também significa o preço mais recente)

No entanto, sugiro que você adicione uma coluna "IsCurrent" que seja 0 se não for o preço mais recente ou 1 se for o mais recente. Isso adicionará o possível risco de dados inconsistentes, mas acelerará muito todo o processo quando a tabela ficar maior (se estiver em um índice). Então tudo que você precisa fazer é...
SELECT *
   FROM Thing
   WHERE ThingID IN (1,2,3,4)
     AND IsCurrent = 1

ATUALIZAÇÃO

Ok, Markus atualizou a pergunta para mostrar que ID é um uniqueid, não um int. Isso torna a escrita da consulta ainda mais complexa.
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)

Eu realmente sugeriria usar uma coluna "IsCurrent" ou ir com a outra sugestão encontrada nas respostas e usar a tabela "preço atual" e uma tabela separada "histórico de preços" (que seria a mais rápida, porque mantém o preço mesa em si pequena).

(Eu sei que o ThingID na parte inferior é redundante. Apenas tente se é mais rápido com ou sem "WHERE". Não tenho certeza de qual versão será mais rápida depois que o otimizador fizer seu trabalho.)