SQL:将列的每个记录与一系列值进行比较

时间:2014-02-24 19:09:27

标签: sql sql-server-2008

我有一个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   ...

先谢谢大家...顺便说一句,这是我在这个论坛上的第一个问题,实际上是第一个在地球上的论坛!!

3 个答案:

答案 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行以显示其工作原理)