У меня есть представление sql, которое содержит данные из трех связанных объектов (Title> Edition> SKU). Данные в этом представлении используются для поиска в ЛЮБОЙ области внутри трех объектов. Например, если вы укажете условие title.regionid = '14', представление вернет 4000 уникальных строк (1 за SKU), которые принадлежат 765 уникальным изданиям, которые принадлежат 456 уникальным титрам.Incrementing Row_Number на основе изменения значения столбца
Мне нужно включить пейджинг на основе титров с помощью Row_Number(). Так
SELECT * FROM myview WHERE title.regionid = '14' AND Row BETWEEN 0 AND 35
Проблема заключается в том, что моя колонке строк необходима для подсчета строк по названию, а не по SKU, так что из результирующего набора 4000 строк, если первый титул содержит 12 изданий и 65 SKUs, номер строки для всех 65 строк должно быть 1, потому что они принадлежат к одному титулу.
Я не могу использовать GroupBy, потому что мое представление содержит 40 + столбцов, все из которых можно найти с помощью предложения WHERE.
Вот запрос:
SELECT *
FROM (
SELECT row_number() OVER (ORDER BY a.TitleSort ASC) AS Row, a.*
FROM (SELECT * FROM v_AdvancedSearch
WHERE
istitledeleted = 0
--AND ISBN = '1-4157-5842-5'
--AND etc
) AS a
) d
WHERE
Row BETWEEN 0 AND 35
На первой странице есть 35 строк, которые только принадлежат 4 названия, но отсчеты столбцов по строкам, так что там останавливается, в то время как, если он рассчитывает на титул, я бы получить 387 строк для страницы 1 ... Как я могу выполнить подкачку в этой ситуации?
Try (PARTITION BY a.Title ORDER BY a.TitleSort ASC) .. –
PARTITION BY будет увеличиваться все строки в пределах данного Название, так что если название имеет 40 артикулов, номера строк будут идти от 1 до 40, тогда, когда Title изменяет, номер строки вернется к 1 для следующего заголовка. Но этого я не хочу. – pnduke
См. [Dense_rank() over()] (http://msdn.microsoft.com/en-us/library/ms173825%28v=sql.105%29.aspx). Он будет производить одинаковое число для одного и того же TitleSort, и у него не будет пробелов, поскольку rank() over() будет. –