#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 строку