यह greatest-n-per-group
. का एक रूपांतर है समस्या जो बार-बार सामने आती है।
आप सिंगल रो फॉर्म फिनिशटियरप्राइस चाहते हैं (इसे p1
कहते हैं) ), फ़िनिशऑप्शन से मेल खाते हुए और सबसे बड़ी मात्रा के साथ, लेकिन फिर भी ProductOptionTier की मात्रा से कम या उसके बराबर।
ऐसा करने का एक तरीका दूसरी पंक्ति से मिलान करने का प्रयास करना है (p2
) फ़िनिशटियरप्राइस से, जिसमें समान फ़िनिशऑप्शन और अधिक मात्रा होगी। यदि ऐसी कोई पंक्ति मौजूद नहीं है (बाहरी जुड़ाव का उपयोग करें और परीक्षण करें कि यह NULL है), तो p1
द्वारा पाई गई पंक्ति सबसे महान है।
SELECT Product.Name, ProductOption.Name, a.Qty, a.Price, SheetSize.UpgradeCost,
FinishType.Name, FinishOption.Name, FinishTierPrice.Qty, FinishTierPrice.Price
FROM `Product`
JOIN `ProductOption`
ON Product.idProduct = ProductOption.Product_idProduct
JOIN `ProductOptionTier` AS a
ON a.ProductOption_idProductOption = ProductOption.idProductOption
JOIN `PaperSize`
ON PaperSize.idPaperSize = ProductOption.PaperSize_idPaperSize
JOIN `SheetSize`
ON SheetSize.PaperSize_idPaperSize = PaperSize.idPaperSize
JOIN `FinishOption`
ON FinishOption.Product_idProduct = Product.idProduct
JOIN `FinishType`
ON FinishType.idFinishType = FinishOption.Finishtype_idFinishType
JOIN `FinishTierPrice` AS p1
ON p1.FinishOption_idFinishOption = FinishOption.idFinishOption
AND p1.Qty <= a.Qty
LEFT OUTER JOIN `FinishTierPrice` AS p2
ON p2.FinishOption_idFinishOption = FinishOption.idFinishOption
AND p2.Qty <= a.Qty AND (p2.Qty > p1.Qty OR p2.Qty = p1.Qty
AND p2.idFinishTierPrice > p1.idFinishTierPrice)
WHERE Product.idProduct = 1
AND p2.idFinishTierPrice IS NULL