我正在尝试进行SQL查询但是我无法获得预期的结果。我真的不知道出了什么问题。
我有一个表Product,其中包含(product_id,title)和其他表Product_Variation,其中包含(product_variation_id,product_id,description,gender,price)
基本上,我有一个产品。对于每种产品,都有N种变体。
e.g
产品:标题“我不知道” Product_Variation:description“T-Shirt”,性别“男性”,价格“59.90”
我需要的是选择Product and 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
谢谢!
答案 0 :(得分: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
如果您有两个价格相同的变体,您将获得一个随机行。
答案 1 :(得分: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 强>
答案 2 :(得分: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