MYSQL:在 table 中为每个供应商选择价格最低的三个
MYSQL: Selecting the three lowest priced for each vendor in a table
努力应对看似简单的事情 select。我有一个报价 table,其中包含价格、供应商和 SKU。多个供应商可以销售同一个 sku,同一个供应商也可以多次销售同一个 sku。我需要每个供应商针对特定 sku 提供的三个最低价报价。
offers
+-----+--------+-------+
| sku | vendor | price |
+-----+--------+-------+
| abc | vend_a | 1.00 |
| abc | vend_a | 2.00 |
| abc | vend_a | 3.00 |
| abc | vend_a | 4.00 |
| abc | vend_a | 5.00 |
| abc | vend_b | 1.00 |
| abc | vend_b | 2.00 |
| abc | vend_b | 3.00 |
| abc | vend_b | 4.00 |
| abc | vend_b | 5.00 |
| abc | vend_c | 1.00 |
| abc | vend_c | 2.00 |
| abc | vend_c | 3.00 |
| abc | vend_c | 4.00 |
| abc | vend_c | 5.00 |
+-----+--------+-------+
所以在select之后,我想要这个
result
+-----+--------+-------+
| sku | vendor | price |
+-----+--------+-------+
| abc | vend_a | 1.00 |
| abc | vend_a | 2.00 |
| abc | vend_a | 3.00 |
| abc | vend_b | 1.00 |
| abc | vend_b | 2.00 |
| abc | vend_b | 3.00 |
| abc | vend_c | 1.00 |
| abc | vend_c | 2.00 |
| abc | vend_c | 3.00 |
+-----+--------+-------+
进行了一些搜索,但没有找到任何能给我这种结果的东西。感谢您的帮助。
可以使用变量模拟ROW_NUMBER
window函数,MySQL中不可用:
SELECT vendor, price
FROM (
SELECT vendor, price,
@rn := IF(@v = vendor, @rn + 1,
IF(@v := vendor, 1, 1)) AS rn
FROM offers
CROSS JOIN (SELECT @rn := 0, @v := '') AS vars
WHERE sku = 'abc'
ORDER BY vendor, price) AS t
WHERE t.rn <= 3
变量@rn
枚举每个vendor
分区内的记录。 @rn=1
对应分区中价格最低的记录,@rn=2
对应下一条记录,依此类推
努力应对看似简单的事情 select。我有一个报价 table,其中包含价格、供应商和 SKU。多个供应商可以销售同一个 sku,同一个供应商也可以多次销售同一个 sku。我需要每个供应商针对特定 sku 提供的三个最低价报价。
offers
+-----+--------+-------+
| sku | vendor | price |
+-----+--------+-------+
| abc | vend_a | 1.00 |
| abc | vend_a | 2.00 |
| abc | vend_a | 3.00 |
| abc | vend_a | 4.00 |
| abc | vend_a | 5.00 |
| abc | vend_b | 1.00 |
| abc | vend_b | 2.00 |
| abc | vend_b | 3.00 |
| abc | vend_b | 4.00 |
| abc | vend_b | 5.00 |
| abc | vend_c | 1.00 |
| abc | vend_c | 2.00 |
| abc | vend_c | 3.00 |
| abc | vend_c | 4.00 |
| abc | vend_c | 5.00 |
+-----+--------+-------+
所以在select之后,我想要这个
result
+-----+--------+-------+
| sku | vendor | price |
+-----+--------+-------+
| abc | vend_a | 1.00 |
| abc | vend_a | 2.00 |
| abc | vend_a | 3.00 |
| abc | vend_b | 1.00 |
| abc | vend_b | 2.00 |
| abc | vend_b | 3.00 |
| abc | vend_c | 1.00 |
| abc | vend_c | 2.00 |
| abc | vend_c | 3.00 |
+-----+--------+-------+
进行了一些搜索,但没有找到任何能给我这种结果的东西。感谢您的帮助。
可以使用变量模拟ROW_NUMBER
window函数,MySQL中不可用:
SELECT vendor, price
FROM (
SELECT vendor, price,
@rn := IF(@v = vendor, @rn + 1,
IF(@v := vendor, 1, 1)) AS rn
FROM offers
CROSS JOIN (SELECT @rn := 0, @v := '') AS vars
WHERE sku = 'abc'
ORDER BY vendor, price) AS t
WHERE t.rn <= 3
变量@rn
枚举每个vendor
分区内的记录。 @rn=1
对应分区中价格最低的记录,@rn=2
对应下一条记录,依此类推