2013-04-11 6 views
0

У меня есть представление 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 ... Как я могу выполнить подкачку в этой ситуации?

+0

Try (PARTITION BY a.Title ORDER BY a.TitleSort ASC) .. –

+0

PARTITION BY будет увеличиваться все строки в пределах данного Название, так что если название имеет 40 артикулов, номера строк будут идти от 1 до 40, тогда, когда Title изменяет, номер строки вернется к 1 для следующего заголовка. Но этого я не хочу. – pnduke

+1

См. [Dense_rank() over()] (http://msdn.microsoft.com/en-us/library/ms173825%28v=sql.105%29.aspx). Он будет производить одинаковое число для одного и того же TitleSort, и у него не будет пробелов, поскольку rank() over() будет. –

ответ

0
WITH Titles AS 
(
SELECT * 
FROM (
SELECT row_number() OVER (ORDER BY a.TitleSort ASC) AS Row, a.* 
    FROM (SELECT DISTINCT TitleSORT, TitleId FROM v_AdvancedSearch 
    WHERE 
     istitledeleted = 0 
     --AND ISBN = '1-4157-5842-5' 
     --AND PictureFormat = 'Widescreen' 
     --AND UPC = '0-9736-14381-6-0' 
     --AND Edition = 'Standard' 
     ) AS a 
) d 
WHERE 
Row BETWEEN 0 AND 35 
) 
SELECT * FROM v_AdvancedSearch V 
INNER JOIN Titles ON Titles.TitleId = V.TitleId 
WHERE istitledeleted = 0 
--CONDITIONS NEED TO BE REPEATED HERE 
--AND ISBN = '1-4157-5842-5' 
ORDER BY V.TitleSort ASC 
0

Эта форма работает лучше всего для меня

WITH 
[cte] AS ( 
    SELECT 
     DENSE_RANK () OVER (ORDER BY [v].[TitleSort], [v].[TitleId]) AS [ordinal], 
     [v].[TitleSort], 
     [v].[TitleId] 
     --, 
     --field list, 
     --etc 
    FROM [v_AdvancedSearch] AS [v] 
    WHERE 
     [v].[istitledeleted] = 0 
     --AND 
     --additional conditions AND 
     --etc 
) 
SELECT 
    [v].[ordinal], 
    [v].[TitleSort], 
    [v].[TitleId] 
    --, 
    --field list, 
    --etc 
FROM [cte] AS [v] 
WHERE 
    [v].[ordinal] >= 0 AND 
    [v].[ordinal] <= 35 
ORDER BY [v].[ordinal]; 
  • Нет необходимости DISTINCT или GROUP BY
  • Нет необходимости повторять критерии условий
  • Просто нужно иметь этот список явно поле

https://docs.microsoft.com/en-us/sql/t-sql/functions/dense-rank-transact-sql

https://www.google.com/search?q=%22sql+server%22+%22select+star%22

Смежные вопросы