0

我正在使用 MS SQL SERVER 2008,并创建了以下查询(简化);

SELECT DATE_A, DATE_B
CASE
WHEN DATEDIFF(day, DATE_A, GETDATE()) >= 1 THEN 1
WHEN DATEDIFF(day, DATE_B, GETDATE()) >= 1 AND DATEDIFF(day, DATE_A, GETDATE()) <1 THEN             2
ELSE 3
END AS sortPriority,
CASE
--deadline past
WHEN DATEDIFF(day, DATE_A, GETDATE()) >= 1 THEN DATE_A
--review only past
WHEN DATEDIFF(day, DATE_B, GETDATE()) >= 1 AND DATEDIFF(day, DATE_A()) <1 DATE_B
--anything else
ELSE DATE_B
END AS sortDate
FROM myTable
WHERE (DATEDIFF(day, DATE_A, GETDATE()) >=1 OR DATEDIFF(day, DATE_B, GETDATE()) >=1)
ORDER BY sortPriority, sortDate;

该查询返回 DATE_A 或 DATE_B 早于今天日期的行。行先按 sortPriority 排序,然后按 sortDate。

我现在需要为此查询添加分页,但是当我在 ROW_NUMBER() 函数的 order by 子句中使用 sortPriority 或 sortDate 列时,查询失败;

WITH sortedTable AS
(
SELECT DATE_A, DATE_B,
CASE
WHEN DATEDIFF(day, DATE_A, GETDATE()) >= 1 THEN 1
WHEN DATEDIFF(day, DATE_B, GETDATE()) >= 1 AND DATEDIFF(day, DATE_A, GETDATE()) <1 THEN 2
ELSE 3
END AS sortPriority,
CASE
--deadline past
WHEN DATEDIFF(day, DATE_A, GETDATE()) >= 1 THEN DATE_A
--review only past
WHEN DATEDIFF(day, DATE_B, GETDATE()) >= 1 AND DATEDIFF(day, DATE_A()) <1 DATE_B
--anything else
ELSE DATE_B
END AS sortDate,
ROW_NUMBER() OVER (sortPriority, sortDate) AS 'RowNumber'
FROM myTable
WHERE (DATEDIFF(day, DATE_A, GETDATE()) >=1 OR DATEDIFF(day, DATE_B, GETDATE()) >=1)
)
SELECT * 
FROM sortedTable 
WHERE RowNumber BETWEEN 10 AND 20;

我收到以下错误消息;

Msg 207, Level 16, State 1, Line 24
Invalid column name 'sortPriority'.
Msg 207, Level 16, State 1, Line 24
Invalid column name 'sortDate'.

并且行号指的是我的示例代码的这一行;

ROW_NUMBER() OVER (sortPriority, sortDate) AS 'RowNumber'

我怎样才能解决这个问题并获得所需的结果(原始排序完整的分页)

4

1 回答 1

2

未经测试:

WITH sortedTable AS
(
    SELECT DATE_A, DATE_B, sortPriority, sortDate,
           ROW_NUMBER() OVER (sortPriority, sortDate) AS 'RowNumber'
      FROM
          (
            SELECT DATE_A, DATE_B,
                   CASE WHEN DATEDIFF(day, DATE_A, GETDATE()) >= 1 THEN 1
                        WHEN DATEDIFF(day, DATE_B, GETDATE()) >= 1 AND DATEDIFF(day, DATE_A, GETDATE()) <1 THEN 2
                        ELSE 3
                    END AS sortPriority,
                   CASE
                        --deadline past
                        WHEN DATEDIFF(day, DATE_A, GETDATE()) >= 1 THEN DATE_A
                        --review only past
                        WHEN DATEDIFF(day, DATE_B, GETDATE()) >= 1 AND DATEDIFF(day, DATE_A()) <1 DATE_B
                        --anything else
                        ELSE DATE_B
                    END AS sortDate
               FROM myTable
              WHERE (DATEDIFF(day, DATE_A, GETDATE()) >=1 OR DATEDIFF(day, DATE_B, GETDATE()) >=1)
          ) T
)
SELECT * 
FROM sortedTable 
WHERE RowNumber BETWEEN 10 AND 20;
于 2013-02-11T18:35:26.820 回答