Возвращаемые значения ROW_NUMBER () не соответствуют - PullRequest
1 голос
/ 30 мая 2011

Я использовал функцию ROW_NUM () для подкачки в ASP.NET

SELECT row_num, expense_id,email, reason, amount,date,category_name,is_income
FROM
  (
  SELECT e.expense_id,e.email, e.reason, e.amount,e.date,c.category_name,e.is_income, 
  ROW_NUMBER() OVER(ORDER BY e.date DESC,e.expense_id) as row_num
  FROM Expense e
  JOIN Category c ON e.category_id = c.category_id
  WHERE e.date >='5-1-2011' AND e.date<='5-31-2011'
  ) as ExpenseInfo
WHERE email='sample@domain.com'

Но он вернул несогласованный список row_num (например, 1,3,4 ... или 2,3,4 ...). Как я могу решить эту проблему?

Заранее спасибо.

Я решил свою проблему

SELECT RowNum, expense_id, email, reason, amount, date, category_name, is_income
FROM
(
SELECT e.expense_id, e.email, e.reason, e.amount, e.date, c.category_name, e.is_income, Row_Number() OVER(ORDER BY date DESC) as row_num 
FROM Expense e JOIN Category c 
  ON e.category_id = c.category_id
WHERE e.date >='5-1-2011' AND e.date<='5-31-2011' AND e.email='sample@domain.com'
) AS ExpenseInfo
WHERE row_num>=1 and row_num<=20

Ответы [ 2 ]

2 голосов
/ 30 мая 2011

Добавьте ROW_NUMBER в основной запрос.Когда вы добавляете его в подзапрос, сначала генерируются числа, а затем вы фильтруете записи.Когда вы генерируете номера строк в конечном результате, у вас не будет этой проблемы.

select
  s.*,
  row_number() over(order by s.date desc, s.expense_id) as row_num
from
  (
   /*YourQueryWithAllItsConditions*/
  ) s
0 голосов
/ 30 мая 2011

Where email = 'sample@domain.com' отфильтровывает определенные строки. Для того, что вы делаете здесь, вам не нужен «внешний» запрос. Просто оберните все это вместе.

 SELECT ROW_NUMBER() OVER(ORDER BY e.date DESC, e.expense_id) as row_num
       , e.expense_id
       , e.email
       , e.reason
       , e.amount
       , e.date
       , c.category_name
       , e.is_income
  FROM Expense e
  JOIN Category c 
    ON e.category_id = c.category_id
  WHERE e.date >='5-1-2011' 
    AND e.date <='5-31-2011'
    AND e.email = 'sample@domain.com'
...