27,579
社区成员
发帖
与我相关
我的任务
分享
;with cte as
(
select ROW_NUMBER() over(PARTITION by userid order by ABS(datediff(day,getdate(),ordertime)) desc) as row,
userid,
ordertime
from #t2
)
select b.NAME,a.ordertime
from cte a
join #t1 b on a.userid=b.id
where a.row=1
;with cte as
(
select ROW_NUMBER() over(PARTITION by userid order by ordertime desc) as row,
userid,
ordertime
from #t2
)
select b.NAME,a.ordertime
from cte a
join #t1 b on a.userid=b.id
where a.row=1
NAME ordertime
-------------------- -----------------------
a 2015-07-31 00:00:00.000
b 2015-07-26 00:00:00.000
(2 行受影响)
/* 测试数据
WITH Users(ID,UserName) AS (
SELECT 1,'张三' UNION ALL
SELECT 2,'李四' UNION ALL
SELECT 3,'王五'
)
,Appointment(ID,UserID,OrderTime) AS (
SELECT 1,1,'2015-07-30' UNION ALL
SELECT 2,1,'2015-07-23' UNION ALL
SELECT 3,2,'2015-07-26' UNION ALL
SELECT 4,1,'2015-07-31' UNION ALL
SELECT 5,2,'2015-07-21' UNION ALL
SELECT 6,1,'2015-07-26'
) */
SELECT u.UserName,
ISNULL(a1.OrderTime, a2.OrderTime) OrderTime
FROM Users u
LEFT JOIN (
SELECT UserID,
MIN(OrderTime) OrderTime
FROM Appointment
WHERE OrderTime >= GETDATE()
GROUP BY UserID
) a1
ON u.ID = a1.UserID
LEFT JOIN (
SELECT UserID,
MAX(OrderTime) OrderTime
FROM Appointment
WHERE OrderTime < GETDATE()
GROUP BY UserID
) a2
ON u.ID = a2.UserID
UserName OrderTime
-------- ----------
张三 2015-07-30
李四 2015-07-26
王五 NULL
CREATE TABLE #t1
(
id INT,
NAME varchar(20)
)
INSERT INTO #t1 VALUES(1,'a');
INSERT INTO #t1 VALUES(2,'b');
INSERT INTO #t1 VALUES(3,'c');
CREATE TABLE #t2
( id INT ,
userid INT ,
ordertime DATETIME
)
INSERT INTO #t2 VALUES (1,1,'2015-07-30');
INSERT INTO #t2 VALUES (2,1,'2015-07-23');
INSERT INTO #t2 VALUES (3,2,'2015-07-26');
INSERT INTO #t2 VALUES (4,1,'2015-07-31');
INSERT INTO #t2 VALUES (5,2,'2015-07-21');
INSERT INTO #t2 VALUES (6,1,'2015-07-26')
SELECT * FROM
(SELECT * FROM #t1) a
LEFT JOIN
(
SELECT userid,MAX(d) AS rq FROM
(
SELECT userid,MAX(ordertime) AS d FROM #t2 WHERE ordertime<GETDATE() GROUP BY userid
UNION ALL
SELECT userid,MIN(ordertime) AS d FROM #t2 WHERE ordertime>=GETDATE() GROUP BY userid
) x
GROUP BY x.userid
) b
ON a.id=b.userid
DROP TABLE #t1,#t2
我想到的是这个最笨的办法