在SQL中对CTE结果进行排序
我有以下SQL:在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,
;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;按操作日期说明订购。谢谢