SQL根据列值从表中选择x行数

时间:2015-03-23 17:40:03

标签: sql sql-server

我正在寻找一种方法,按照以下标准从产品表中选择4个供应商的前3行:

  1. 必须选择4家供应商。
  2. 必须为按产品评级排序的每个供应商选择前3个产品。
  3. 我尝试过这样的事情:

    select top 12 * product, vendor 
    from products 
    order by productrating
    
    但是很明显,这并不能为每个供应商提供3种产品。

    产品表格包含:

    productid (int), productname (nvarchar(500)), productrating (float), 
    vendor (id), price (float).
    

    这些是相关专栏。

3 个答案:

答案 0 :(得分:2)

您可以使用ANSI标准row_number()功能为每个供应商提供3种产品:

select p.*
from (select p.*,
             row_number() over (partition by vendor order by rating desc) as seqnum
      from products p 
     ) p
where p.seqnum <= 3

如果您想要4家供应商:

select top 12 p.*
from (select p.*,
             row_number() over (partition by vendor order by rating desc) as seqnum
      from products p 
     ) p
where p.seqnum <= 3
order by vendor;

答案 1 :(得分:0)

这将为您提供每个供应商的前3个产品。您没有说明您如何选择4家供应商。使用WHERE子句或使用不同的ORDER BY可以很容易地包含该逻辑,具体取决于您选择4个供应商的方式。

SELECT TOP 12 vnd.Vendor, apl.ProductName
  FROM Vendors vnd
 CROSS APPLY (
        SELECT TOP 3 ProductID
          FROM Products prd
         WHERE vnd.ProductID = prd.ProductID
         ORDER BY prd.ProductRating DESC
       ) apl
ORDER BY vnd.VendorName

答案 2 :(得分:0)

如果您有要查询的固定供应商列表,可以使用以下方法:

SELECT  TOP 3 
        p.ProductID
FROM    Products p
WHERE   p.ProductID IN ( SELECT     v.ProductID
                         FROM       Vendors v
                         WHERE      v.VendorID IN (Vendor1ID, Vendor2ID, Vendor3ID, Vendor4ID)
ORDER BY p.ProductRating DESC

如果你有供应商名称来选择它们按名称过滤掉,但是保持加入coindition以及它的ID,你需要寻找一种解决方法。