2015-03-27 2 views
0

Это мой запрос:выбрать следующий набор топ-30 записей

SELECT Top 30 * 
FROM (SELECT *, Row_number() OVER(PARTITION BY EntityPicURL 
            ORDER BY FavoriteCount desc) AS RN 
     FROM TweetEntity 
     WHERE HashTag LIKE '%%23RIPOlgaSyahputra%') A 
WHERE RN = 1 
ORDER BY FavoriteCount desc , LastModifieddateTime desc 

Это отберет первые 30 уникальных записей столбца entitypicURl. Теперь, когда я хочу выбрать следующие 30 записей (31-60).

Это своего рода запрос, который я использовал ранее, но это возвратило много повторяющихся записей entitypicURL.

select * 
from (select *, row_no = row_number() over (order by FavoriteCount desc, 
                LastModifiedDateTime desc) 
     from TweetEntity 
     where HashTag like '%%23RIPOlgaSyahputra%') e 
where e.row_no > 30 and e.row_no <=60 

Теперь я хочу, чтобы объединить значение первого запроса и включают в себя e.row_no>30 and e.row_no<60 из второго запроса.

Это не дубликат. Моя путаница просто объединяет два запроса, потому что у них есть row_numbers.

+0

В какой версии сервера sql вы используете –

+0

возможный дубликат [Что является лучшим способом для разбивки на страницы в SQL Server] (http://stackoverflow.com/questions/109232/what-is-the-best-way -to-paginate-results-in-sql-server) – Pred

+0

См. https://technet.microsoft.com/en-us/library/gg699618%28v=sql.110%29.aspx –

ответ

2

Вы можете использовать вложенные CTE сек, как это:

;WITH CTE1 AS (
    SELECT *, 
      ROW_NUMBER() OVER(PARTITION BY EntityPicURL 
          ORDER BY FavoriteCount desc) AS RN 
    FROM TweetEntity 
    WHERE HashTag like '%%23RIPOlgaSyahputra%' 
), CTE2 AS (
    SELECT *, 
      ROW_NUMBER() OVER (ORDER FavoriteCount DESC, 
            LastModifiedDateTime DESC) AS row_no  
    FROM CTE1 
    WHERE RN = 1 
) 
SELECT * 
FROM CTE2 
WHERE row_no > 30 and row_no <=60    

CTE2 будет применяться ROW_NUMBER на фильтруется RN = 1 результирующего набора из CTE1.

+0

Фантастический. Это то, что я искал. Запрос с запросом. Он отлично работал. Благодарю. – Venkat

0

Вы можете использовать OFFSET для извлечения записей, как этот

вы можете выбрать 30 записей из ниже запроса

Select * FROM TweetEntity 
ORDER BY FavoriteCount desc OFFSET 0 ROWS FETCH NEXT 30 ROWS ONLY 

Вы можете выбрать следующие 30 записей из ниже запроса

Select * FROM TweetEntity 
ORDER BY FavoriteCount desc OFFSET 30 ROWS FETCH NEXT 30 ROWS ONLY 

Примечание :OFFSET Будет работать на Sql server 2012+

Ограничения при использовании OFFSET-FETCH

  • ORDER BY является обязательным для использования OFFSET и FETCH положение.
  • Предложение OFFSET является обязательным с FETCH. Вы никогда не сможете использовать, ORDER BY ... FETCH.
  • TOP не может быть объединен с OFFSET и FETCH в том же запросе выражение.
  • Выражение rowcount OFFSET/FETCH может быть любой арифметикой, константой, или выражением параметра, которое вернет целочисленное значение. Выражение rowcount не поддерживает скалярные подзапросы.
+0

Если вы посмотрите на мой второй запрос, у него есть разбиение на страницы. Мой вопрос, однако, получает первый запрос в разбивке на страницы, поскольку я не могу слить два row_numbers правильно – Venkat

+0

@Venkat Я предлагаю вам способ для разбивки на страницы –

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