2013-04-17 44 views
0

我有两个表:使用max函数

TotalTimeTable 
(date date,time time) 

FinalListA 
(date date, time time, A int, B int) 

我运行下面的查询:

SELECT t1.date, 
     t1.time, 
     max(t2.time) 
FROM TotalTimeTable t1, 
    FinalListA t2 
WHERE t2.date=t1.date 
    AND t2.time <= t1.time 
GROUP BY t1.date, 
     t1.time 
ORDER BY t1.date, 
     t1.time 

有没有办法从FinalListA拔出A和B,时间=“MAX( t2.time)“在同一个查询中?

TotalTimeTable:

date  time  
2006-01-01 9:30:01  
2006-01-01 9:30:02 
2006-01-01 9:30:03 
2006-01-01 9:30:04 
2006-01-01 9:30:05 
2006-01-01 9:30:06 

FinalListA:

date  time  A B 
2006-01-01 9:28:01 1 4 
2006-01-01 9:30:02 2 3 
2006-01-01 9:30:04 4 7 
2006-01-01 9:30:07 6 4 
2006-01-01 9:30:10 8 9 
2006-01-01 9:30:11 1 2 

预期的结果是:

date  time  A B 
2006-01-01 9:30:01 1 4 
2006-01-01 9:30:02 2 3 
2006-01-01 9:30:03 2 3 
2006-01-01 9:30:04 4 7 
2006-01-01 9:30:05 4 7 
2006-01-01 9:30:06 4 7 

的时间是从TotalTimeTable FinalListA.time不必在结果。

+2

请提供示例行。 –

回答

0

使用交叉适用于:

SELECT t1.date 
    , t1.time 
    , t2.time 
    , t2.A 
    , t2.B 
FROM TotalTimeTable t1 
CROSS APPLY (
SELECT TOP(1) 
    T2.time 
, T2.A 
, T2.B 
FROM FinalListA t2 
WHERE T2.date = T1.date 
AND T2.time <= t1.time 
ORDER BY T2.time DESC 
) AS T2 
ORDER BY t1.date, 
    t1.time 
+0

对不起,还没有时间测试它 –

+0

结果是正确的,但它比@techdo –

+0

慢一点这些都是一样的,但感谢您的投票下来。 – Serge

1

请尝试:

SELECT t1.date, 
     t1.time, 
     (select top 1 t2.A from FinalListA t2 where t2.date=t1.date and t2.Time<=t1.Time order by t2.Time desc) A, 
     (select top 1 t2.B from FinalListA t2 where t2.date=t1.date and t2.Time<=t1.Time order by t2.Time desc) B 
FROM TotalTimeTable t1 

或使用左加入

select 
    x.date, 
    x.Time, 
    x.A, 
    x.B 
from(
    SELECT t1.*, 
      t2.A, 
      t2.B, 
      ROW_NUMBER() over (PARTITION BY t1.date, t1.time order by t2.time desc) RNum 
    FROM TotalTimeTable t1 left join 
     FinalListA t2 on t1.date=t2.date and t2.Time<=t1.Time 
)x where RNum=1 

或使用CROSS APPLY

SELECT t1.date, 
     t1.time, 
     x.* 
FROM TotalTimeTable t1 cross apply (
SELECT TOP 1 t2.A, t2.B from FinalListA t2 where t2.date=t1.date and t2.Time<=t1.Time order by t2.Time desc)x 
+0

请添加示例数据和预期输出。 – TechDo

+0

我刚刚添加了示例数据,我将在一分钟内添加预期输出 –

+0

请使用子查询和左连接来检查编辑后的答案。 – TechDo

0

您可以使用原始查询作为约束子查询(不含ORDER BY)

SELECT t1.Date, t1.Time, t2.Time, t2.A, t2.B 
FROM TotalTimeTable t1 
INNER JOIN 
(
    SELECT t1.date, 
      t1.time, 
      maxt2Time = max(t2.time) 
    FROM TotalTimeTable t1, 
     FinalListA t2 
    WHERE t2.date=t1.date 
     AND t2.time <= t1.time 
    GROUP BY t1.date, 
      t1.time 
) tmax 
ON t1.Date = tmax.date AND t1.Time = tmax.Time 
INNER JOIN FinalListA t2 ON t2.Date = tmax.Date AND t2.Time = tmax.maxt2Time 
+0

@ Serge下面的交叉申请快了大约50% – Ackroydd

+0

是的,这是我打算这样做的方式,但我想检查是否有比这更简单/更快的查询。 –

+0

可以将子查询减少为INNER JOIN(SELECT Date,time = max(time)from FinalListA GROUP BY date)tmax – Ackroydd