Sql Union查询帮助

时间:2010-06-24 15:45:46

标签: c# sql sql-server cursor

我需要一点帮助来编写查询。我有这个数据......

vDir    iNumber
North   19
North   27
North   29
North   31
South   46
South   49
South   51
South   61

我需要查询数据并输出类似这样的输出

vDir    iLowNumber    iHiNumber
North   19            27
North   27            29
North   29            31
South   46            49
South   49            51
South   51            61

这里的想法是选择方向,LowNum然后选择nextNumber。当方向改变重新开始时。 (这就是为什么我认为我需要一个联盟,也许是北方,然后是南方联盟)。另请注意,每个方向的最高编号都不会创建记录,因为没有更高的编号。第一组有8条记录,查询结果只有6.如何创建一个查询来执行此操作?任何帮助表示赞赏。这也是一个2008 SQL数据库,所以我可以使用2008 TSQL。我需要光标吗?是否可以使用c#和Linq更好的解决方案?我真的很好奇如何在SQL中执行此操作。谢谢你们!

干杯, 〜在圣地亚哥

4 个答案:

答案 0 :(得分:2)

另一种可能的解决方案:

SELECT
    T1.vDir,
    T1.iNumber AS iLowNumber,
    T2.iNumber AS iHiNumber
FROM
    My_Table T1
INNER JOIN My_Table T2 ON
    T2.vDir = T1.vDir AND
    T2.iNumber > T1.iNumber
LEFT OUTER JOIN My_Table T3 ON
    T3.vDir = T1.vDir AND
    T3.iNumber > T1.iNumber AND
    T3.iNumber < T2.iNumber
WHERE
    T3.vDir IS NULL  -- If this is NULL it means that no rows exist between T1 and T2

答案 1 :(得分:1)

    select a.vDir, 
           a.iNumber as iLowNumber, 
           b.iNumber as iHiNumber 
      from TheTable a
inner join TheTable b on a.vDir = b.vDir
                  and a.iNumber < b.iNumber 
                  and not exists(select 1 
                                   from TheTable c 
                                  where a.vDir = b.vDir
                                    and a.iNumber < c.iNumber 
                                    and c.iNumber < b.iNumber)

有趣的是到目前为止有3个不同的答案,每个答案都有不同的表现特征。

答案 2 :(得分:0)

这样做会很好

select * from(
 select direction,inumber as low,
 (select top(1) inumber  from cte as b where b.direction=a.direction
 and b.INumber>a.inumber) as high
 from cte as a
 ) as x where high is not null

答案 3 :(得分:0)

在我看来,最自然的解决方案是:

select t1.vdir, t1.inumber as lownumber, min(t2.inumber) as highnumber
from mytable t1
join mytable t2 on t2.vdir=t1.vdir
  and t2.inumber>t1.inumber
group by t1.vdir, t1.inumber
order by t1.vdir, t1.inumber

这与我未调查过的其他解决方案相比如何。