我有一个SQL查询,它返回table1中列出的数据。我想比较列table1.Count和table2.Count_Range。应返回Count值落入其相关Value列的范围。
表1:
Time Count
2014/02/24 00:00 23.3
2014/02/24 01:00 43.1
2014/02/24 02:00 93.5
2014/02/24 03:00 123.9
2014/02/24 04:00 173.0
2014/02/24 05:00 223.7
...
...
表2:
Count_Range Value
10 1
20 2
30 3
40 4
50 5
...
...
例如。在00:00,值为23.3,从表2开始,它落在20到30之间,因此返回的值应为2.同样,对于01:00,返回的值应为4.
决赛桌应如下所示
建议输出表3:
Time Count Value
2014/02/24 00:00 23.3 2
2014/02/24 01:00 43.1 4
2014/02/24 02:00 93.5 ...
2014/02/24 03:00 123.9 ...
2014/02/24 04:00 173.0 ...
2014/02/24 05:00 223.7 ...
先谢谢大家...顺便说一句,这是我在这个论坛上的第一个问题,实际上是第一个在地球上的论坛!!
答案 0 :(得分:0)
您可以使用相关子查询执行此操作:
select t1.*,
(select top 1 t2.value
from table2 t2
where t2.count_range < t1."count"
order by t2.count_range desc
) as value
from table1 t1;
或者,SQL Server为此类事件提供apply
关键字:
select t1.*, t2.value
from table1 t1 cross apply
(select top 1 t2.value
from table2 t2
where t2.count_range < t1."count"
order by t2.count_range desc
) t2;
我更喜欢第一种方法,因为它是标准SQL(除了top
关键字)。
答案 1 :(得分:0)
另一个要做的是首先将Count Range列分解为每个范围的低值和高值:
Low High Value
0 9 0
10 19 1
20 29 2
30 39 3
40 49 4
50 59 5
... ... ...
And then using the following query:
SELECT Table1.Count, Table2.Value
FROM Table2 INNER JOIN Table1
ON Table1.Count >= Table2.LowRange
AND Table1.Count <= Table2.HighRange;
答案 2 :(得分:0)
您可以使用简单的子查询来实现此目的:
SELECT *,
(SELECT MAX(value) FROM table2 WHERE Count_Range <= table1.Count) AS VALUE
FROM table1
在现有的表2中,您还必须为范围0到10添加一行。
请参阅SQL Fiddle Demo(请注意,table2仅包含前11行以显示其工作原理)