У меня есть запрос, который должен получить первый и второй по величине sku в каждом списке пожеланий участников. Приведенный ниже запрос работает, но он занимает слишком много времени, поскольку у него около 9 миллионов пользователей, и у каждого пользователя есть около 10 элементов списка желаний, поэтому вы можете видеть, что приведенный ниже запрос никогда не завершится.
SELECT MAX(CASE WHEN wl.rank = 1 THEN wl.SKU ELSE NULL END) AS [highestSku],
MAX(CASE WHEN wl.rank = 2 THEN wl.SKU ELSE NULL END) AS [secondHighestSku],
FROM Member m
LEFT JOIN (SELECT *
FROM (SELECT DENSE_RANK() OVER (PARTITION BY wl.MemberID ORDER BY wli.Price DESC) AS rank, wl.MemberID, wli.SKU
FROM WishListItem wli
INNER JOIN WishList wl ON wli.WishListID = wl.ID) T1) w ON w.MemberID = m.ID
У меня вопрос: есть ли лучший способ получить первые и вторые записи для каждого пользователя? Если нет, то есть ли способ оптимизировать этот запрос? В идеале, если я смогу уменьшить количество таймов, извлеченных из запроса ранжирования (с помощью DENSE_RANK ()), это поможет мне. Я хотел сделать что-то вроде WHERE DENDS_RANK () <= 2, но это невозможно, и выполнение этого за скобками наносит ущерб цели души. </p>
Кроме того, это только часть запроса. На самом деле у меня осталось еще больше объединений в большем количестве таблиц, которые содержат столько же элементов, и мне нужно получить первые 1 и 2 записи для каждого пользователя.
И это нужно сделать в одном запросе или в максимально возможной степени в одном, потому что я добавляю его в таблицу данных. Я также могу уменьшить количество записей, т.е. TOP 1000 и разбить запрос, но мне нужно будет продолжить с того места, где я остановился ... также я попробовал TOP 1000, и через 10 минут я отменил запрос, потому что мне нужно получить все 9 миллионов записей.