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

Popraw kwerendę SQL za pomocą funkcji select max() w klauzuli where

spróbuj tego:

;WITH CurrentPrice AS 
(
SELECT productid,max(Date) AS Date
    FROM productprice 
    WHERE date < @DateIn 
    GROUP BY productid
)

select  
    p.ProductName,
    pp.Price,
    pp.Date,
    from product p
        inner join CurrentPrice pa  on p.productid = pa.productid
        inner join productprice pp  on pa.productid = pp.productid AND pa.Date=pp.Date
    where p.producttype = 'OnSale'

EDYTUJ na podstawie komentarza OP:

Myślę, że powyższe zapytanie z CTE będzie miało taki sam plan zapytań jak wyprowadzona wersja tabeli z @Remus Rusanu

Jeśli jednak productprice tabela jest duża, możesz ją zmniejszyć, filtrując według „OnSale " jak tutaj:

;WITH CurrentPrice AS 
(
select  
    p.productid,
    MAX(pp.Date) AS Date
    from product p
        inner join productprice pp  on pa.productid = pp.productid
    where p.producttype = 'OnSale' AND pp.date < @DateIn 
    GROUP BY productid
)
select  
    p.ProductName,
    pp.Price,
    pp.Date,
    from CurrentPrice           pa
        inner join product      p   on pa.productid = p.productid
        inner join productprice pp  on pa.productid = pp.productid AND pa.Date=pp.Date
    where p.producttype = 'OnSale'


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak usunąć pliki w SQL Server 2019

  2. DATEDIFF() vs DATEDIFF_BIG() w SQL Server:jaka jest różnica?

  3. SQLCMD Nie można ukończyć procesu logowania z powodu opóźnienia w otwieraniu połączenia z serwerem

  4. Pakiet SSIS kończy się niepowodzeniem z błędem Jeśli 64-bitowy sterownik nie jest zainstalowany, uruchom w trybie 32-bitowym

  5. Czy mogę zwrócić varchar(max) z procedury składowanej?