2017-05-04 112 views
0

我在我的数据库中有每种产品的不同类型的表格。我想根据该类型为每个产品拉出最高的1条记录。这是我当前的查询:从查询列表中查询每个类型的SQL查询最高1值?

SELECT 
    dh_type, 
    dh_product 
FROM myProducts 
WHERE dh_productid = '08-BLD4011603S0' 
    AND dh_type IN ('New','Old','Ref') 
ORDER BY dh_createDt DESC 

每种类型可以有多个产品已在不同日期创建。我想为每种类型拉最高记录(最新的基于创建日期)。一个新的,一个旧的和一个参考。我想知道什么是在SQL中最好和最有效的方法?当前查询将为每种类型提取多个记录,而我只需要一个记录。

+1

添加一些示例表格数据和预期结果 - 以及格式化文本。 – jarlh

回答

2

有多种方式可以通过使用窗口功能(如row_number())来获得您想要的方式。 row_number函数允许你为每一行使用一个分区创建一个唯一的数字,在你的情况下,分区是dh_type,然后通过你的dh_createDT命令创建数字。那么最终的结果将是一个ROW_NUMBER = 1:

select dh_type, 
     dh_product 
from 
(
    SELECT 
     dh_type, 
     dh_product, 
     rn = row_number() over(partition by dh_type order by dh_createDT desc) 
    FROM myProducts 
    WHERE dh_productid = '08-BLD4011603S0' 
     AND dh_type IN ('New','Old','Ref') 
) d 
where rn = 1; 

另一种方式来获得的结果将是使用子查询得到max(dh_createDT)每个dh_typedh_product行,然后加入该回你表:

select 
    dh_type, 
    dh_product 
from myProducts p 
inner join 
(
    select 
    dh_type, 
    dh_product, 
    MaxDate = max(dh_createDT) 
    from myProducts 
    where h_productid = '08-BLD4011603S0' 
    and dh_type IN ('New','Old','Ref') 
    group by dh_type, dh_product 
) p1 
    on p.dh_type = p1.dh_type 
    and p.dh_product = p1.dh_product 
    and p.dh_createDT = p1.MaxDate 
where p.h_productid = '08-BLD4011603S0' 
    and p.dh_type IN ('New','Old','Ref') 
1

Ollie有一个非常好的答案。然而,如果性能问题,那么下面可能会更快:

(SELECT TOP (1) dh_type, dh_product 
FROM myProducts 
WHERE dh_productid = '08-BLD4011603S0' AND dh_type = 'New' 
ORDER BY dh_createDt DESC 
) UNION ALL 
(SELECT TOP (1) dh_type, dh_product 
FROM myProducts 
WHERE dh_productid = '08-BLD4011603S0' AND dh_type = 'Old' 
ORDER BY dh_createDt DESC 
) UNION ALL 
(SELECT TOP (1) dh_type, dh_product 
FROM myProducts 
WHERE dh_productid = '08-BLD4011603S0' AND dh_type = 'Ref' 
ORDER BY dh_createDt DESC 
); 

出于性能考虑,你想对myProducts(dh_productid, dh_type, dh_createDt)的索引。您也可以通过dh_product以及索引完全覆盖查询。