SQL нумерация страниц, включая повторяющиеся строки - PullRequest
0 голосов
/ 28 января 2020

У меня возникли проблемы с решением проблемы с разбиением на страницы в SQL.

Я застрял, пытаясь заполнить переменную @PageSize в моей хранимой процедуре, полученной из некоторого ODATA, однако значение из ODATA не понимает, что мне нужно. Мой запрос, который вы видите, возвращает результаты, подобные этому.

+----+----------+
| ID | PersonID |
+----+----------+
| 1  | 1        |
+----+----------+
| 1  | 2        |
+----+----------+
| 2  | 1        |
+----+----------+
| 2  | 2        |
+----+----------+
| 2  | 3        |
+----+----------+
| 3  | 4        |
+----+----------+
| 3  | 4        |
+----+----------+

Очевидно, что если бы я получил @PageResult = 5 от OData, он просто вернул бы 5 строк, но я хочу, чтобы он возвращал x вхождений ID.

Чтобы продемонстрировать, что я в основном хочу, это то, что если мой @PageSize равен 1, мой spro c вернет это.

+----+----------+
| ID | PersonID |
+----+----------+
| 1  | 1        |
+----+----------+
| 1  | 2        |
+----+----------+

Если это 2, я верну это.

+----+----------+
| ID | PersonID |
+----+----------+
| 1  | 1        |
+----+----------+
| 1  | 2        |
+----+----------+
| 2  | 1        |
+----+----------+
| 2  | 2        |
+----+----------+
| 2  | 3        |
+----+----------+

И так далее. У меня нет конца проблем, пытаясь заставить его возвращать данные таким образом, я пытался делать такие вещи, как отличный идентификатор top (@pagesize), но всегда кажется, что порядок неверен, поэтому он пропускает идентификаторы, а Похоже, делать работу тоже. Я предполагаю, что это доставляет мне много хлопот, потому что в SQL нет порядка по умолчанию, поэтому решение не так очевидно. Кто-нибудь из вас может подсказать, как мне этого добиться?

Самое близкое, что я получил, это

SET @PageSize = (select COUNT(personId) from #temptable WHERE ID IN (SELECT DISTINCT TOP(@PageSize) ID From #temptable))

1 Ответ

1 голос
/ 28 января 2020

Попробуйте что-то вроде этого:

declare @t table(ID int, PersonID int)

insert into @t(ID,PersonID) values
(1,1),(1,2),(2,1),(2,2),(2,3),(3,3),(3,4);



with q as
(
  select id, row_number() over (order by ID) rn
  from @t 
  group by id
)
select *
from @t  
where id in
(
   select id 
   from q
   where rn between 1 and 2
)
order by ID, PersonID

, который выводит

ID          PersonID
----------- -----------
1           1
1           2
2           1
2           2
2           3

(5 rows affected)
...