ms sql функция row_number () - не позволяет использовать в том же выражении - PullRequest
4 голосов
/ 07 марта 2012

У меня есть следующий SQL-оператор:

$sql = "select siteid, row_number() OVER (ORDER BY siteid) as rownum FROM nwsite WHERE rownum >= 4";

«rownum» работает, когда я использую имя вне запроса (например, в цикле foreach), но когда дело доходит до использования его в качестве предложения WHERE, оно никогда не работает.

Есть идеи?

Спасибо

Ответы [ 5 ]

5 голосов
/ 07 марта 2012

Один из вариантов:

  • заключить оператор выбора в подвыбор
  • использовать псевдоним rownum во внешнем запросе

SQL Statement

select *
from   (
         select siteid
                , row_number() OVER (ORDER BY siteid) as rownum 
         FROM   nwsite 
       ) q
where  rownum >= 4
3 голосов
/ 07 марта 2012

Поскольку предложение where вычисляется до вычисления оконной функции row_number, вы не можете включить этот столбец в предложение where.

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

выберите siteid, rownum из (выберите siteid, row_number () OVER (ORDER BY siteid) как rownum FROM nwsite) nw ГДЕ rownum> = 4

В этом случае внутренний запрос вычисляется полностью, а затем передается внешнему запросу, в котором можно выполнить обработку столбца rownum.

1 голос
/ 07 марта 2012

Вы также можете определить RowNum в CROSS APPLY, что позволит вам ссылаться на него.

select siteid, 
       RowNum
FROM nwsite 
CROSS APPLY (SELECT row_number() OVER (ORDER BY siteid)) CxA(rownum)
WHERE rownum >= 4
1 голос
/ 07 марта 2012

Использовать общее табличное выражение:

with Result (field1, field2...,rn)
as
(select field1, field2..., rn=row_number() over (partition by field1 order by field 2)
from yourTable)
select * from result where rn<=3 ; -- top 3 in each group
1 голос
/ 07 марта 2012

Попробуй так:

$sql = "select siteid, row_number() OVER (ORDER BY siteid) as rownum FROM nwsite WHERE row_number() >= 4";

Нельзя использовать псевдоним, определенный в части столбцов в одном и том же предложении WHERE. Предложение WHERE пока не содержит этой информации.

...