2010-06-24 136 views
4

我需要一點幫助來編寫查詢。我有這個數據...Sql聯合查詢幫助

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中做到這一點。多謝你們!

乾杯, 〜CK在聖地亞哥

+0

我不認爲聯盟在這裏是必要的。我將它從標籤列表中刪除,然後添加sql-server,以便獲得更多的目光。 – 2010-06-24 15:50:17

+0

看起來像http://ask.sqlservercentral.com上的問題之一 - 不確定是否可以立即找到合適的問題,但如果您在那裏問問題,您可能會得到一個快速答案! – 2010-06-24 15:53:19

+0

問題:iLowNumber/iHiNumbers只會增加嗎?你有沒有在序列中獲得vDir的單個條目? – 2010-06-24 15:54:29

回答

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 
+0

子查詢解決方案更符合我繪製問題的方式,但這是一個非常優雅的解決方案。對於數據集越來越大,它也應該很快。 – Bill 2010-06-24 16:11:46

+0

非常感謝。這是一個非常乾淨清晰的解決方案!生成正確的輸出。做得好! – Hcabnettek 2010-06-24 16:24:14

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個不同的答案,到目前爲止,各有不同的性能特點。

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 
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 

如何的這個性能比較我還沒有研究其他解決方案。