2016-02-24 252 views
0

enter image description here選擇範圍與行號

我從SQL Server 2008表,按相反的順序(DESC)序列號(行號)需要的數據。

我的表名是ProductDetails

我用這個查詢

WITH Sum_Ctl (TOt) as 
(
    select count(*)+1 
    from ProductDetails 
    where ProductDetails.UserId = 38 
) 
SELECT 
    Tot - ROW_NUMBER() OVER (ORDER BY PrdID asc) AS SNO, 
    * 
FROM 
    ProductDetails, Sum_Ctl 
WHERE 
    UserId = 38 

2192行數據存在於表用戶38.我使用上面的查詢

SNO column 2192 2191 2190 .... to 1 

問題得到它:我需要20行數據,即2020年至2000年只有

我試圖and SNO between 2020 and 2000與查詢,但得到

無效的列名稱'SNO'。

然後我試圖

where 
    UserId = 38 
    and Tot - ROW_NUMBER() OVER (ORDER BY PrdID asc) between 2020 and 2000 

窗函數只能出現在SELECT或ORDER BY子句。

任何幫助,將在這裏感謝

+0

認真你已經搞砸了查詢請發佈樣本數據和輸出 – mohan111

+0

@ mohan111感謝您的回覆,添加了示例屏幕截圖 – Fool

回答

2

有問題是你不能where子句中使用窗口功能。這是logical processing order的後果。簡而言之,在所有其他處理完成後生成行號,包括您​​在where中可能使用的任何過濾器。

您可以使用子查詢或CTE解決此限制。在這個例子中ROW_NUMBER是在子查詢中計算的。這又由主查詢過濾。

SELECT 
    * 
FROM 
    (
     -- SNIO will be available to outer WHERE. 
     SELECT 
      ROW_NUMBER() OVER (ORDER BY PrdID ASC) AS sno, 
      * 
     FROM 
      ProductDetails 
     WHERE 
      ProductDetails.UserId = 38 
    ) AS sq 
WHERE 
    sno BETWEEN 2000 AND 2020 
; 

此操作,因爲子查詢其全部處理,則結果被傳遞到外部查詢之前。

+0

感謝您的答案,但「關鍵字附近的語法不正確」 – Fool

+0

Doe the UserId列存在於ProductDetails中? –

+0

是的,UserId有 – Fool