2014-07-16 60 views
2
------------------------------------ 
    X  Y 
------------------------------------ 
    10  20 
    10  5 
    10  9 
    50  40 
    50  30 
    100  70 
    100  100 

考慮1,2,3排爲一組 和4,5-行作爲B組 和6,7-行作爲C組獲取僅最靠近Y中柱下部向X柱

行我想要得到一組只有一行,該行應視 X,Y列值佔用。

這是最接近的較低的X

預期結果

Ÿ列的值

------------------------------------ 
     X  Y 
    ------------------------------------ 
     10  9 
     50  40 
     100  100 
+0

的問題是,應該怎樣退還,如果一組中的所有Y> X – xacinay

+0

則該行將被跳過。 –

回答

5

您可以有條件聚集做到這一點:

select x, max(case when y <= x then y end) as y 
from table t 
group by x; 
1

替代解決方案

DECLARE @tb TABLE (
X float , Y float 
) 

INSERT INTO @tb (X,Y) values 
(10, 20), 
(10, 5), 
(10, 9), 
(50, 40), 
(50, 30), 
(100, 70), 
(100, 100); 

select a.* from (
    select row_number() over(partition by X order by abs(X-Y) asc) as rn, X, Y 
    from @tb 
) a where a.rn = 1; 
+1

我試過一樣的,但'戈登Linoff'答案是更好的解決方案... – Jesuraja

+0

Agree..posted讓筆者看到不同的方法 – xacinay

1
DECLARE @tb TABLE (
X float , Y float 
) 

INSERT INTO @tb (X,Y) values 
(10, 20), 
(10, 5), 
(10, 9), 
(50, 40), 
(50, 30), 
(100, 70), 
(100, 100); 

; WITH CTE AS 
(
Select t.X,t.Y,RN from (Select tt.X,tt.Y,ROW_NUMBER()OVER(PARTITION BY tt.X ORDER BY tt.Y DESC)RN from @tb tt)t 
) 
Select DISTINCT C.X,MAX(CASE WHEN C.Y <= C.X THEN C.Y END)AS Y FROM CTE C 
GROUP BY C.X