Получить данные из Выбрать верх - PullRequest
0 голосов
/ 03 октября 2019

Мне уже был дан ответ на вопрос о моей предыдущей проблеме При выборе top с использованием SQL Server возвращается другой вывод, чем при выборе *

Я хочу получить select top n данные из базы данных на основе алфавита& формат нумерации. Вывод должен быть отсортирован по алфавиту в первую очередь, а затем по номеру.

Когда я пытаюсь получить все данные (select *), я получаю правильный вывод:

select nocust, share 
from TB_STOCK
where share = ’BBCA’ 
  and concat(share, nocust) < ‘ZZZZZZZZ’
order by 
    case when nocust like ‘[a-z]%’ then 0 else 1 end, nocust


nocust | share
-------+--------
a522   | BBCA
b454   | BBCA
k007   | BBCA
p430   | BBCA
q797   | BBCA
s441   | BBCA
s892   | BBCA
u648   | BBCA
v107   | BBCA
4211   | BBCA
6469   | BBCA
6751   | BBCA

, когда я пытаюсь select top n (например: топ 5), я получаюправильные данные тоже:

select top 5 nocust, share 
from TB_STOCK
where share = ’BBCA’ 
  and concat(share, nocust) < ‘ZZZZZZZZ’
order by 
    case when nocust like ‘[a-z]%’ then 0 else 1 end, nocust

nocust | share
-------+--------
a522   | BBCA
b454   | BBCA
k007   | BBCA
p430   | BBCA
q797   | BBCA

Проблема в том, что, когда я пытаюсь получить следующую топ-5 на основе последнего nocust и делиться на предыдущие топ-5 данных (concat(share, nocust) < 'ZZZZq797')) он возвращает неверные ожидаемые данные:

select top 5 nocust, share 
from TB_STOCK
where share = ’BBCA’ 
and concat(share, nocust) < ‘ZZZZq797’
order by 
case when nocust like ‘[a-z]%’ then 0 else 1 end, nocust

nocust | share
-------+--------
a522   | BBCA
b454   | BBCA
k007   | BBCA
p430   | BBCA
q797   | BBCA

должно возвращаться:

nocust | share
-------+--------
s441   | BBCA
s892   | BBCA
u648   | BBCA
v107   | BBCA
4211   | BBCA

Я предполагаю, что ошибка находится где-то между concat и order by, может кто-нибудь сказать мне, как получить правильный верх 5.

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Я не уверен, есть ли встроенная функция для получения диапазонов строк, но вы всегда можете использовать ROW_NUMBER:

select nocust, share
FROM (
  select nocust, share, 
    ROW_NUMBER() OVER(
      ORDER BY case when nocust like ‘[a-z]%’ then 0 else 1 end, nocust
    ) AS RowNum -- Assign rows "row numbers" based on `ORDER BY`
  from TB_STOCK
  where share = ’BBCA’ 
    and concat(share, nocust) < ‘ZZZZZZZZ’
) src
WHERE RowNum BETWEEN <start_row_num> AND <end_row_num> -- Get specified row range
order by 
  case when nocust like ‘[a-z]%’ then 0 else 1 end, nocust -- Not sure if this is needed

Это назначит "номера строк" каждой строке на основеваш ORDER BY и затем возвращает только диапазон строк, указанный в предложении WHERE.

0 голосов
/ 04 октября 2019

Вы должны показать полный запрос.

Также в вашем запросе эта вещь мне не понятна and concat(share, nocust) < ‘ZZZZZZZZ’. Я не получаю, какой тип данных у вас есть и что он будет возвращать или каков ваш ожидаемый результат .

Я думаю, я создам Indexed view в таком сценарии.

CREATE VIEW dbo.vStockView
WITH SCHEMABINDING
AS
    select  nocust, [share] ,
 0  SortCol
from TB_STOCK
where 
--  share = ’BBCA’ 
--  and concat(share, nocust) < ‘ZZZZZZZZ’ 
 -- and 
  isnumeric(nocust)=0

  union all

  select  nocust, [share] ,
 1  SortCol
from TB_STOCK
where 
  isnumeric(nocust)=1

GO

Обратите внимание, что я прокомментировал, где условие, потому что это не требуется в представлении. Это может быть реализовано в Proc.

У меня нет полной информации о вашем запросе, таблица.

Поэтому индекс может быть не таким хорошим.

CREATE NONCLUSTERED INDEX CX_vStockView
  ON dbo.vStockView(SortCol); 
GO

Теперь вы создаете новый процесс, подобный этому,

Create Proc spGETStock
@share varchar(30)
@PageNumber int,
@RowspPage int=30
as

BEGIN
set nocount on

select nocust,[share] 
--,count(*)over() as TotalRecords
from vStockView
where share = @share
ORDER BY SortCol
OFFSET ((@PageNumber - 1) * @RowspPage) ROWS
FETCH NEXT @RowspPage ROWS ONLY;

End

Или вы можете реализовать пейджинг с использованием Row_Number в Sql server 2008 и ниже.

Я уверен, что это значительно улучшит производительность.

...