2011-05-06 68 views
0

HI(通过与具有MAX组),SQL服务器 - 查询帮助

我在与一个查询一个巨大的问题,这是我在我的表中的数据:

entityId    groupId    groupDepth 
-------------------- -------------------- ----------- 
NULL     1090     0 
56     1090     1 
222     1090     1 
226     1090     1 
227     1090     1 
228     1090     1 
234     1090     1 
248     1090     2 
249     1090     2 
250     1090     2 
251     1090     2 
252     1090     1 
256     1090     1 
261     1090     1 
288     1090     1 
294     1090     1 
300     1090     1 
4691     1090     1 
4694     1090     1 
4697     1090     1 

所以我想要做的是在给定entityId和groupId时获得groupDepth最高的行。示例结果:

input: entityId = 294, groupId = 1090 
entityId    groupId    groupDepth 
-------------------- -------------------- ----------- 
294     1090     1 


input: entityId = 113, groupId = 1090 
entityId    groupId    groupDepth 
-------------------- -------------------- ----------- 
NULL     1090     0 

我在想是这样的:

SELECT * FROM [dbo].[EntityGroup] a 
WHERE EXISTS 
(
    SELECT groupId 
    FROM  [dbo].[EntityGroup] b 
    WHERE  
       (b.entityId is null or b.entityId = 294) AND 
       b.groupId = a.groupId 
    GROUP BY b.groupId 
    HAVING a.groupDepth = max(b.groupDepth) and 
       a.entityId = b.entityId 
) 

任何帮助将不胜感激!

回答

2
SELECT entityID, groupId, groupDepth 
FROM EntityGroup t 
WHERE groupDepth = (SELECT MAX(groupDepth) FROM EntityGroup e WHERE COALESCE(e.entityID,-1) = COALESCE(t.entityId,-1) AND e.groupId = t.groupID) 
GROUP BY entityID, groupId, groupDepth 

如果我正确

编辑

SELECT entityID, groupId, groupDepth 
FROM EntityGroup t 
WHERE groupDepth = (SELECT MAX(groupDepth) FROM @Temp e WHERE e.entityID = t.entityId AND e.groupId = t.groupID) 
GROUP BY entityID, groupId, groupDepth 
UNION 
SELECT entityID, groupId, groupDepth 
FROM EntityGroup t 
WHERE groupDepth = (SELECT MAX(groupDepth) FROM @Temp e WHERE e.groupId = t.groupID AND e.entityId IS NULL) AND t.entityId IS NULL 
GROUP BY entityID,groupId, groupDepth 
+0

如果我指定不中EntityGroup表中存在ENTITYID,我将不会收到NULL行 - 请参阅我的第二个示例 – MonkeyCoder 2011-05-06 08:08:25

+0

查看我所做的更新是否有帮助 – 2011-05-06 08:14:35

0

这个怎么理解,你应该工作?

DECLARE @entityId INT = 294 
DECLARE @groupId INT = 1090 

SELECT TOP 1 entityId, groupid, Max(groupDepth) AS groupDepth 
FROM EntityGroup 
WHERE (entityId is null OR entityId = @entityId) 
AND groupId = @groupId 
GROUP BY entityId, groupId 
order by entityId desc 

编辑:更新SQL通过ENTITYID以降序排列,并采取第一个会给出正确的答案指定的情况下

+0

这很好,我在结果集中得到了两行 - 一个NULL值为entityId,一个带有294当我应该只有一行。 – MonkeyCoder 2011-05-06 08:17:38

+0

@MonkeyCoder - 对。我已经编辑了答案,现在只有1行 – Catch22 2011-05-06 09:06:20