PDA

View Full Version : برگرداندن یک محصول از هر دسته بندی



aliblue
پنج شنبه 17 مرداد 1392, 13:55 عصر
فرض کنید یک جدول دسته بندی داریم با فیلدهای CatID,Name
و یک جدول محصول با فیلد های PID,Pname,Tartib,CID
که CID به شماره دسته بندی اشاره میکنه.
حالا چطوری از هر دسته بندی فقط یک محصول آخر را SELECT کنم؟
ترتیب محصول با فیلد Tartib مشخص می شود.
با تشکر.

محمد سلیم آبادی
پنج شنبه 17 مرداد 1392, 15:14 عصر
SELECT * FROM
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY CID ORDER BY Tartib DESC) AS rnk FROM Products
) AS D
INNER JOIN Categories AS C
ON D.CID = C.CatID
WHERE rnk = 1

aliblue
پنج شنبه 17 مرداد 1392, 16:34 عصر
ممنون. میشه در مورد ROW_NUMBER() OVER(PARTITION BY
توضیح بدین؟
من خودم یک روش دیگه نوشتم کار هم کرد. بدین صورت که با Max(tartib) , Group By سلکت کردم و در #temp ریختم و سپس join کردم. میشه بگید کدوم روش بهتره و فرقش چیه؟

محمد سلیم آبادی
پنج شنبه 17 مرداد 1392, 16:55 عصر
میتونید به Books Online مراجعه کنید یا تو اینترنت با واژه Ranking Function جستجو کنید مثال های متنوعی برای یادگیری هست.

نیاز به temp table نیست. همه رو میشه در یک query نوشت:
SELECT P.*, C.*
FROM Products P
INNER JOIN Categories AS C
ON P.CID = C.CatID
INNER JOIN
(
SELECT CID, MAX(Tartib) AS mx
FROM Products
GROUP BY CID
)D
ON P.CID = D.PID
AND P.Tartib = D.Tartib;

از لحاظ عملکرد هر دو خیلی خوب هستند. ولی اگر تعمیم پذیری براش شما دارای اهمیت است. مثل اینکه بخواهید به ازای هر دسته دو محصول آخر رو بیارین خوب روشه group by max دیگه جواب نمیده مجبورین از توابع Ranking استفاده کنید.