简化SQL select语句

tun*_*ula 6 sql t-sql

我有这种结构的表

CREATE TABLE UsersHistory
(
    Id          INT IDENTITY,
    UserID      INT,
    StatusId    INT,
    CreateTime  DATETIME,
    ChangedTime DATETIME
)

INSERT INTO UsersHistory(UserID, StatusId, CreateTime, ChangedTime)
SELECT 1,1,'20150414','20150414' UNION ALL
SELECT 1,2,'20150414','20150415' UNION ALL
SELECT 1,3,'20150414','20150416' UNION ALL
SELECT 2,1,'20150413','20150413' UNION ALL
SELECT 2,3,'20150413','20150416'
Run Code Online (Sandbox Code Playgroud)

和查询

;WITH k AS (
SELECT uh.UserID,MAX(uh.ChangedTime) AS Dt FROM UsersHistory AS uh
WHERE uh.ChangedTime<'20150416'
GROUP BY uh.UserID
)
SELECT k.UserID,uh.StatusId FROM k
INNER JOIN UsersHistory AS uh
    ON k.UserID = uh.UserID AND k.Dt = uh.ChangedTime
Run Code Online (Sandbox Code Playgroud)

查询太简单了,不需要更多解释.我想简化我的.(删除与datetime类型列的连接).

有什么建议吗?

ugh*_*hai 1

您可以使用ROW_NUMBER()withPARTITION来实现此目的。像这样的东西

;WITH CTE as 
( 
    SELECT UserID, StatusId, CreateTime, ChangedTime,ROW_NUMBER()OVER(PARTITION BY UserID ORDER BY ChangedTime DESC) r
    FROM UsersHistory
    WHERE ChangedTime < '20150416'
)
SELECT UserID, StatusId FROM CTE
WHERE r = 1
Run Code Online (Sandbox Code Playgroud)