Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Подобрете Sql заявката с функцията select max() в клаузата where

опитайте това:

;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'

РЕДАКТИРАНЕ въз основа на коментара на OP:

Мисля, че горната заявка с CTE ще има същия план за заявка като изведена таблична версия от @Remus Rusanu

Ако обаче productprice е голяма, може да искате да я намалите, като филтрирате по „OnSale “ като тук:

;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. Индексира ли SQL Server нулеви стойности в неклъстериран неуникален индекс?

  2. ИЗБЕРЕТЕ ЗА АКТУАЛИЗИРАНЕ със SQL Server

  3. Сортиране на куршуми в базата данни

  4. Вмъкване на оператор + Комбиниране на данни от таблица и променлива в тригер

  5. Как да създам документ на сървъра, като стартирам съществуваща съхранена процедура или sql израза на тази процедура на R2008 sql сървър