2016-01-18 6 views
0

Если я использую этот SQL, я получаю это записи:Разбивка с SQL Server 2014

SELECT * FROM news WHERE 

ID  TITLE 
----  ------- 
23  title 1 
25  title 2 
31  title 3 
38  title 4 
43  title 5 
....   .... 
178  title 69 
189  title 70 

Если я использую пагинацию, мой SQL будет таким:

SELECT *, 
    COUNT(*) OVER() AS Total, 
    ROW_NUMBER() OVER (ORDER BY news_date DESC, news_id DESC) AS Position 
FROM news 
ORDER BY news_date DESC, news_id DESC 
OFFSET 5 ROW FETCH NEXT 5 ROWS ONLY; 

ID  TITLE  TOTAL  POSITION 
----  -------  ------- ---------- 
45  title 6  70   #6 
46  title 7  70   #7 
48  title 8  70   #8 
51  title 9  70   #9 
54  title 10  70   #10 

Теперь, я бы получить первые 3 и последние 3 значения и получить # 27 (например) с (# 27 + 3 И # 27-3), потому что мой идентификатор «127» (с позицией № 27). я могу сделать частичный SQL:

WITH NewsSql AS (
SELECT 
    *, 
    COUNT(*) OVER() AS Total, 
    ROW_NUMBER() OVER (ORDER BY new_date DESC,new_id DESC) AS Position 
FROM news 
)SELECT * FROM NewsSql 
WHERE Position<=3 OR Position>=Total-2 OR news_id=127 

ID  TITLE  TOTAL  POSITION 
----  -------  ------- ---------- 
23  title 1  70   #1 
25  title 2  70   #2 
31  title 3  70   #3 
127  title 27  70   #27 
175  title 68  70   #68 
178  title 69  70   #69 
189  title 70  70   #70 

Как я могу добавить записи с позиции между # 24 и # 30?

PD: Извините за мой английский

+0

Таким образом, вы получаете какой-то вход откуда-то, что это 27 (или 127, не ясно, что на самом деле), и что вы хотите в качестве вывода (всегда) первые 3 строки, затем строка, соответствующая вводу, плюс три строки с каждой стороны и (всегда) последние 3 строки, заключается в том, что верный? Что должно произойти, если входные данные перекрываются с первым или последним требованием? Повторяются ли строки только один раз? –

+0

Используйте 'WHERE Position BETWEEN 24 и 30' ?? ..... –

+0

Мой ввод будет ID-кодом (25,127, 178 ......), но мне нужна позиция для использования 'BETWEEN'. Если вход перекрывается с первым или последним запросом, показывайте только записи. На самом деле в этом нет никаких проблем. – Andynedine

ответ

0

Я решил вопрос с этим SQL:

WITH NewsSql AS (
    SELECT 
    *, 
    COUNT(*) OVER() AS Total, 
    ROW_NUMBER() OVER (ORDER BY news_date DESC,news_id DESC) AS Position, 
    (
     SELECT Pos 
     FROM (
      SELECT 
       news_id AS NewsID, 
       news_title, 
       ROW_NUMBER() OVER (ORDER BY news_date DESC,news_id DESC) AS Pos 
      FROM news 
     ) news_pos 
     WHERE news_pos.NewsID= <ID_input> 
    ) AS Actual 
    FROM news 
) 
SELECT * FROM NewsSql 
WHERE 
    Position<=3 OR 
    Position>=Total-2 OR 
    news_id=127 OR 
    Position BETWEEN Actual-5 AND Actual+5