2

我正在尝试执行 SQL 查询,但无法获得预期的结果。我真的不知道出了什么问题。

我有一个包含 (product_id, title) 的表 Product 和包含 (product_variation_id, product_id, description, gender, price) 的其他表 Product_Variation

基本上,我有一个产品。对于每个产品,有 N 个变体。

例如

产品:标题“我不知道” Product_Variation:描述“T 恤”,性别“男”,价格“59.90”

我需要的是选择 Product 和 Product_Variation 仅显示价格最低的产品。

我不在乎产品是否有 T 恤、夹克或其他任何变化。我只需要获得价格最低的变体。

我的查询是:

SELECT b.product_id, b.title, MIN(b.price) as price, b.gender

FROM (

        SELECT p.product_id, p.title, MIN(pv.price) AS price, pv.gender
        FROM products p
        join product_variation pv ON pv.product_id = p.product_id
        GROUP BY p.product_id, p.title, pv.price, pv.gender

    ) b     

GROUP BY b.product_id, b.title, b.price, b.gender

请参阅我在 SQL Fiddle 中的示例

谢谢!

4

3 回答 3

1

由于您使用的是 SQL 2008,您可以使用它ROW_NUMBER来查找价格最低的行:

SELECT *
FROM products p
INNER JOIN 
(SELECT 
    product_id,
    Description,
    Gender,
    Price,
    ROW_NUMBER() OVER(PARTITION BY product_id ORDER BY price)  Row
FROM product_variation )
pv ON pv.product_id = p.product_id
AND Row = 1

如果您有两个价格相同的变体,您将获得一个随机行。

于 2013-09-26T20:34:50.497 回答
0

您可以使用rank()窗口函数对分区(组)中的内容进行排序,但赋予相同的项目相同的等级:

;With b as (
    Select
        p.product_id,
        p.title, 
        pv.price,
        pv.gender,
        rank() over(partition by p.product_id order by pv.price) rk
    From
        products p
            Inner Join
        product_variation pv
            On pv.product_id = p.product_id
)
Select
  b.product_id, 
  b.title, 
  b.price,
  b.gender
From
  b
Where
  rk = 1

如果即使有相同的产品,您也只想要一种产品,请使用row_number()而不是rank()

Example Fiddle

于 2013-09-26T20:35:09.043 回答
0
-- Solution #1
SELECT  *
FROM
(
SELECT  p.product_id, p.title, 
        pv.price, pv.gender,
        ROW_NUMBER() OVER(PARTITION BY p.product_id ORDER BY pv.price) AS row_num
FROM    products p
join    product_variation pv ON pv.product_id = p.product_id
) src
WHERE   src.row_num = 1

-- Solution #2
SELECT  p.product_id, p.title, 
        x.price, x.gender
FROM    products p
cross apply
(
        SELECT  TOP(1) pv.price, pv.gender
        FROM    product_variation pv 
        WHERE   pv.product_id = p.product_id
        ORDER BY pv.price
) x
于 2013-09-26T20:36:28.587 回答