مشكلة وصول MS المعقدة إلى Greatest-N-Per-Group
-
05-07-2019 - |
سؤال
إنني أتطلع إلى دمج الاستعلامات التالية في استعلامات واحدة، حيث
- scouting.jumpGate عدد صحيح،
- scouting.astroLoc عبارة عن سلسلة،
- scouting.ownerguild عبارة عن سلسلة و
- scouting.galaxy هو عدد صحيح
التي ترتبط بجدول آخر (وهي مجموعتي):
Select TOP 3
scouting.jumpGate,
scouting.astroLoc,
scouting.ownerGuild,
scouting.Galaxy
FROM scouting
WHERE scouting.Galaxy = 1
AND scouting.ownerGuild = 'TEST'
ORDER BY scouting.jumpGate DESC,
scouting.astroloc DESC;
و
SELECT TOP 3
scouting.jumpGate,
scouting.astroLoc,
scouting.ownerGuild,
scouting.Galaxy
FROM scouting
WHERE scouting.Galaxy = 2
AND scouting.ownerGuild = 'TEST'
ORDER BY scouting.jumpGate DESC,
scouting.astroloc DESC;
و
SELECT TOP 3
scouting.jumpGate,
scouting.astroLoc,
scouting.ownerGuild,
scouting.Galaxy
FROM scouting
WHERE scouting.Galaxy = 3
AND scouting.ownerGuild = 'TEST'
ORDER BY scouting.jumpGate DESC,
scouting.astroloc DESC;
استمر حتى
SELECT TOP 3
scouting.jumpGate,
scouting.astroLoc,
scouting.ownerGuild,
scouting.Galaxy
FROM scouting
WHERE scouting.Galaxy = 79
AND scouting.ownerGuild = 'TEST'
ORDER BY scouting.jumpGate DESC,
scouting.astroloc DESC;
الكود الذي قمت بإنشائه بعد القراءة على موقع Microsoft على الويب لمشكلة Greatest N Per Group هو كما يلي:
Select scouting.astroLoc,
scouting.galaxy,
scouting.jumpGate,
scouting.ownerGuild
From galaxy Inner Join
scouting On galaxy.[galaxy_ID] = scouting.galaxy
Where scouting.ownerGuild = 'SWARM'
AND (scouting.jumpGate) In (Select Top 3 scouting.jumpGate From scouting Where scouting.galaxy = galaxy.[galaxy_ID] Order By scouting.jumpGate Desc)
Order By scouting.astroLoc Desc,
scouting.jumpGate Desc
في الأساس، هذا قريب جدًا مما أريد.يبدو أن كل شيء يعمل.ومع ذلك، فإن بعض المجموعات لا يتم تمثيلها في الإخراج حتى بعد النظر في البيانات، كل مجموعة لديها سجل يفي بقيود الاستعلام.بالمناسبة، إذا قمت بإزالة قيد scouting.ownerGuild = 'SWARM'، فإنه يعمل بشكل مثالي (لكنني بحاجة إلى هذا القيد).
المحلول
ماذا عن:
Select scouting.astroLoc,
scouting.galaxy,
scouting.jumpGate,
scouting.ownerGuild
From galaxy Inner Join
scouting On galaxy.[galaxy_ID] = scouting.galaxy
WHERE (scouting.ID) In (
Select Top 3 scouting.ID
From scouting
Where scouting.galaxy = galaxy.[galaxy_ID]
And scouting.ownerGuild = 'SWARM'
Order By scouting.jumpGate Desc)
Order By scouting.astroLoc Desc,
scouting.jumpGate Desc
وإلا فمن المحتمل أن تشمل المراكز الثلاثة الأولى بعضًا منها
where scouting.ownerGuild <> 'SWARM'
لا تنتمي إلى StackOverflow