Я пытаюсь преобразовать запрос Linq в SQL. Мой запрос Linq выглядит так:Можете ли вы написать пользовательскую функцию агрегации в SQL? Можете ли вы запросить содержимое группы?
from s in Somethings
where s.CreatedTime >= new DateTime(2010, 01, 01)
where s.CreatedTime < new DateTime(2010, 02, 01)
group s by s.Data into grouping
select grouping.OrderByDescending(s => s.CreatedTime)
.ThenByDescending(s => s.UpdatedTime)
.First();
На словах предполагается, что все вещи будут получены с определенного месяца. Затем сгруппируйте их по определенному ключу. Для каждого ключа мне нужен последний созданный элемент. Если два элемента с одним и тем же ключом были созданы одновременно, я хочу разорвать связи по последнему обновлению.
До сих пор я это для SQL
SELECT s1.*
FROM Somethings s1
JOIN (
SELECT s.Date AS Data, MAX(CreatedTime) AS CreatedTime
FROM Somethings s
WHERE s.CreatedTime >= '20100101'
AND s.CreatedTime < '20100201'
GROUP BY s.Data
) s2 ON s1.Data = s2.Data
AND s1.CreatedTime = s2.CreatedTime
Это работает, но я не могу контролировать, как связи разрываются.
То, что я действительно хочу, - это способ произвольно сортировать каждую группу, как я могу, в Linq. Я хочу определить свою собственную функцию агрегации, которая принимает набор строк и возвращает одну строку. Возможно ли это в SQL, или Linq более выразительным? Функции агрегации SQL MAX, MIN, COUNT и т. Д., Похоже, не являются функциями первого класса, такими как их эквивалент в Linq. Конечно, это может быть просто нехватка знаний SQL.
Вот составлен пример иллюстрирует то, что я хочу сделать в SQL:
SELECT (SELECT *
FROM grouping
ORDER BY CreatedTime DESC, UpdatedTime DESC
LIMIT 1)
FROM Somethings s
WHERE s.CreatedTime >= '20100101'
AND s.CreatedTime < '20100201'
GROUP BY s.Data AS grouping
В этом примере мой нелегальный внутренний запрос служит ту же роль, как функция агрегации.
К сожалению, запрос был домен конкретный материал просачивается в мой domainless вопрос. Я отредактировал его. Теперь я буду исследовать эту вещь row_number :) – dmnd