2014-07-16 36 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