I have a query that returns the lowest Price of a ProductVariation by using ROW_NUMBER() to enumerate the rows in groupings (partitions) of the ProductId, sorted by the Price ascending (MIN function returning multiple rows after adding column to SELECT).
SELECT
pv.Id AS VariationId,
pv.ProductId,
pv.[Description],
pv.Price,
pv.Stock,
ROW_NUMBER() OVER (PARTITION BY pv.ProductId ORDER BY pv.Price, pv.Stock DESC) AS SortId
FROM ProductVariation pv
INNER JOIN Product p ON p.Id = pv.ProductId
WHERE p.CompanyId = @CompanyId
One Product can have multiple variations. Below I have my ProductVariation table.
This query works perfeclty and returns the following results:
| VariationId | ProductId | Description | Price | Stock | SortId |
|---|---|---|---|---|---|
| 149 | 97 | Yellow Fruits | 139.99 | 0.00 | 1 |
| 150 | 97 | Red Fruits | 139.99 | 5.00 | 2 |
| 151 | 97 | Green Apple | 139.99 | 20.00 | 3 |
| 152 | 98 | Peach Mango | 219.99 | 0.00 | 1 |
| 153 | 99 | Crazy Lemon | 169.99 | 1.00 | 1 |
| 154 | 99 | Arctic Ice | 169.99 | 3.00 | 2 |
| 155 | 99 | Paradise Punch | 169.99 | 3.00 | 3 |
However, now we have another table called ProductValueConsultor in which the consultor can update the ProductVariation price individually.
Inside ProductValueConsultor we have a row that updates the ProductVariation price to $149.00 for the id 149.
| StoreId | Price | ProductVariationId |
|---|---|---|
| 13 | 149.90 | 149 |
So now, I updated my query and added the OUTER APPLY operator to identify possible values on ProductValueConsultor table and show the updated prices.
SELECT
pv.Id AS VariationId,
pv.ProductId,
pv.[Description],
ISNULL(pValue.Price, pv.Price) Price,
pv.Stock,
ROW_NUMBER() OVER (PARTITION BY pv.ProductId ORDER BY pv.Price) AS SortId
FROM ProductVariation pv
OUTER APPLY (
SELECT TOP 1 * FROM ProductValueConsultor pvc
WHERE pv.Id = pvc.ProductVariationId AND pvc.StoreId = @StoreId
) pValue
INNER JOIN Product p ON p.Id = pv.ProductId
WHERE p.CompanyId = @CompanyId
The OUTER APPLY operator worked perfeclty, showing the updated price for the ProductVariation id 149. However, the ROW_NUMBER() function broked, showing the sorted order for the original prices.
| VariationId | ProductId | Description | Price | Stock | SortId |
|---|---|---|---|---|---|
| 149 | 97 | Yellow Fruits | 149.99 | 0.00 | 1 |
| 150 | 97 | Red Fruits | 139.99 | 5.00 | 2 |
| 151 | 97 | Green Apple | 139.99 | 20.00 | 3 |
| 152 | 98 | Peach Mango | 219.99 | 0.00 | 1 |
| 153 | 99 | Crazy Lemon | 169.99 | 1.00 | 1 |
| 154 | 99 | Arctic Ice | 169.99 | 3.00 | 2 |
| 155 | 99 | Paradise Punch | 169.99 | 3.00 | 3 |
How can I fix this query to apply the ROW_NUMBER() function on the updated values by the OUTER APPLY?

