在SQL中对CTE结果进行排序

在SQL中对CTE结果进行排序,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有以下SQL: ;WITH CTE AS (SELECT AL.*, RV.FORENAME, RV.SURNAME, RV.USERNAME AS RegistrantUsername, E.FORENAME AS EmployeeForename,

我有以下SQL:

;WITH CTE 
     AS (SELECT AL.*, 
                RV.FORENAME, 
                RV.SURNAME, 
                RV.USERNAME                  AS RegistrantUsername, 
                E.FORENAME                   AS EmployeeForename, 
                E.SURNAME                    AS EmployeeSurname, 
                U.USERNAME, 
                CASE 
                  WHEN @Language = 2 THEN C.NAMELANG2 
                  ELSE C.NAMELANG1 
                END                          AS CompanyName, 
                CASE 
                  WHEN VC.COMPANYID IS NULL THEN 
                    CASE 
                      WHEN @Language = 2 THEN V.COMPANYNAMELANG2 
                      ELSE V.COMPANYNAMELANG1 
                    END 
                  ELSE 
                    CASE 
                      WHEN @Language = 2 THEN VC.NAMELANG2 
                      ELSE VC.NAMELANG1 
                    END 
                END                          AS VacancyCompanyName, 
                CASE 
                  WHEN @Language = 2 THEN V.JOBTITLELANG2 
                  ELSE V.JOBTITLELANG1 
                END                          AS JobTitle, 
                ROW_NUMBER() 
                  OVER( 
                    PARTITION BY AL.REGISTRANTID, AL.COMPANYID 
                    ORDER BY ACTIONDATE ASC) AS RN 
         FROM   DBO.HR_ACTIONLOG AL 
                LEFT OUTER JOIN DBO.REGISTRANTSLISTVIEW RV 
                             ON AL.REGISTRANTID = RV.REGISTRANTID 
                LEFT OUTER JOIN DBO.HR_EMPLOYEES E 
                             ON AL.EMPLOYEEID = E.EMPLOYEEID 
                LEFT OUTER JOIN DBO.HR_USERS U 
                             ON AL.USERID = U.USERID 
                LEFT OUTER JOIN DBO.HR_COMPANIES C 
                             ON AL.COMPANYID = C.COMPANYID 
                LEFT OUTER JOIN DBO.HR_VACANCIES V 
                             ON AL.VACANCYID = V.VACANCYID 
                LEFT OUTER JOIN DBO.HR_COMPANIES VC 
                             ON V.COMPANYID = VC.COMPANYID 
         WHERE  ( @Action IS NULL 
                   OR AL.ACTION = @Action ) 
                AND ( @DateFrom IS NULL 
                       OR DBO.DATEONLY(AL.ACTIONDATE) >= 
                    DBO.DATEONLY(@DateFrom) ) 
                AND ( @DateTo IS NULL 
                       OR DBO.DATEONLY(AL.ACTIONDATE) <= DBO.DATEONLY(@DateTo) ) 
                AND ( @CompanyID IS NULL 
                       OR AL.COMPANYID = @CompanyID ) 
                AND ( @RegistrantID IS NULL 
                       OR AL.REGISTRANTID = @RegistrantID ) 
                AND ( @VacancyID IS NULL 
                       OR AL.VACANCYID = @VacancyID ) 
        --ORDER BY AL.ActionDate DESC 
        ) 
SELECT * 
FROM   CTE 
WHERE  RN = 1; 

将“订单依据”条款移至cte之外:

WITH CTE AS 
(
    ...
)
SELECT *
FROM CTE
WHERE RN = 1;
ORDER BY ActionDate DESC

将“订单依据”条款移至cte之外:

WITH CTE AS 
(
    ...
)
SELECT *
FROM CTE
WHERE RN = 1;
ORDER BY ActionDate DESC

您在
CTE

WITH CTE
AS
{
 ....
}
SELECT *
FROM CTE
WHERE RN = 1
ORDER BY ActionDate DESC

您在
CTE

WITH CTE
AS
{
 ....
}
SELECT *
FROM CTE
WHERE RN = 1
ORDER BY ActionDate DESC
试试这个-

;WITH CTE AS
(
    SELECT  ...
    FROM dbo.hr_ActionLog AL
    LEFT JOIN ...
    WHERE AL.[Action] = ISNULL(@Action, AL.[Action])
        AND dbo.DateOnly(AL.ActionDate) BETWEEN 
            dbo.DateOnly(ISNULL(@DateFrom, AL.ActionDate))
            AND
            dbo.DateOnly(ISNULL(@DateTo, '30000101'))
        AND AL.CompanyID = ISNULL(@CompanyID, AL.CompanyID)
        AND AL.RegistrantID = ISNULL(@RegistrantID, AL.RegistrantID)
        AND AL.VacancyID = ISNULL(@VacancyID, AL.VacancyID)
)
SELECT *
FROM CTE
WHERE RN = 1
ORDER BY AL.ActionDate DESC;
试试这个-

;WITH CTE AS
(
    SELECT  ...
    FROM dbo.hr_ActionLog AL
    LEFT JOIN ...
    WHERE AL.[Action] = ISNULL(@Action, AL.[Action])
        AND dbo.DateOnly(AL.ActionDate) BETWEEN 
            dbo.DateOnly(ISNULL(@DateFrom, AL.ActionDate))
            AND
            dbo.DateOnly(ISNULL(@DateTo, '30000101'))
        AND AL.CompanyID = ISNULL(@CompanyID, AL.CompanyID)
        AND AL.RegistrantID = ISNULL(@RegistrantID, AL.RegistrantID)
        AND AL.VacancyID = ISNULL(@VacancyID, AL.VacancyID)
)
SELECT *
FROM CTE
WHERE RN = 1
ORDER BY AL.ActionDate DESC;

是的,唯一影响返回结果顺序的
ORDER BY
是位于最外层的
SELECT

SELECT *
FROM CTE
WHERE RN = 1
ORDER BY ActionDate DESC

是的,唯一影响返回结果顺序的
ORDER BY
是位于最外层的
SELECT

SELECT *
FROM CTE
WHERE RN = 1
ORDER BY ActionDate DESC

您在CTE中有一个
ROW\u NUMBER
函数,查询只取
RN=1
的行

如果我正确理解了这个问题,只需更改
行数
函数中的
ORDER BY
子句,您就可以得到您要查找的结果。

您在CTE中有一个
行数
函数,查询只取
RN=1的行。

如果我理解正确,只需更改
行数
函数中的
ORDER BY
子句,您就可以得到所需的结果。

所有答案都很好。我在使用Order by时没有删除;像这样,其中RN=1;按操作日期订购描述。谢谢所有答案都很好。我在使用Order by时没有删除;像这样,其中RN=1;按操作日期说明订购。谢谢