Выбор количества строк с ТОП на основе выражения - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь разбить стол на 2 части. (SQL Server 2017) это мой код:

 SELECT TOP COUNT(*)/2 TargetColumn
 FROM SomeTable

Сообщение об ошибке:

Неверный синтаксис рядом с 'COUNT'

ТОП не позволяет мне это делать. выражения с использованием фиксированных чисел или 2000/2 работает, но вышеприведенное с использованием COUNT - нет.

Я искал StackOverflow, но нашел только этот соответствующий пост, который содержит 2 ответа, один из которых был помечен как «опасный», а второй я не понял.

Ответы [ 2 ]

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

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

select targetcolumn
from (
    select 
        targetcolumn, 
        row_number() over(order by somecol) rn,
        count(*) over() cnt
    from sometable
) t
where rn <= cnt / 2

Подзапрос выполняет окно count() всех записей в таблице и ранжирует записи с row_number(). Затем внешние запросы фильтруются в нижней половине.

Обратите внимание, что использование TOP без предложения ORDER BY на самом деле не имеет смысла: порядок записей по своей сути не определен, если не указано явно, поэтому это приводит к в неопределенном наборе возвращаемых строк (хотя с фиксированным количеством записей). Я предположил, что у вас есть столбец для заказа, и назвал его somecol в приведенном выше запросе.

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

Вы не можете сделать это в одном запросе, вам нужно получить количество строк и затем использовать его для вашего top запроса, например,

DECLARE @NumRows INT;

SELECT @NumRows = COUNT(*)/2
FROM SomeTable;

SELECT TOP(@NumRows) TargetColumn
FROM SomeTable;

Это потому, что TOP - простая функция, предназначенная для ограничения количества возвращаемых строк. Необходимость подсчета строк требует возврата всех строк, что противоречит.

Если вы хотите sh выполнить эту операцию в одном запросе, см. Ответ @ GMB.

Для В таблице, на которой я тестировал, это решение заняло 28%, а GMB - 72% без заказа. Если вы добавили заказ по этому решению, заняли 52%, а GMB - 48%. Таким образом, наиболее эффективный запрос зависит от вашего конкретного c сценария.

...