Sql Server — справка по запросу (группируется по МАКСИМУМУ)

#sql #sql-server #group-by #exists #having

#sql #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
  

Итак, что я хотел бы сделать, это получить строку с наибольшей groupDepth при задании EntityId и groupId. Пример результатов:

 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 
)
  

Любая помощь будет высоко оценена!

Ответ №1:

 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
  

Комментарии:

1. Если я укажу EntityId, которого не существует в таблице EntityGroup, я не получу нулевую строку — пожалуйста, обратитесь к моему второму примеру

Ответ №2:

Как насчет этого?

 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 и взятие первого даст правильный ответ для указанных случаев

Комментарии:

1. Это было бы хорошо, если бы я получал две строки в своем результирующем наборе — одну с нулевым значением в качестве EntityId и одну с 294, когда я должен получить только одну строку.

2. @MonkeyCoder — Правильно. Я отредактировал ответ, чтобы теперь получить только 1 строку