2016-06-16 45 views
0

パラメータに等しい値を持つ行またはIDに基づいて閉じた値を持つ行をクエリから取得する必要があります。SQL値に最も近い特定の値を持つ行を取得する

ID   Value 
----------- ----------- 
1   1 
1   2 
1   3 
2   1 
2   2 
3   1 

CREATE TABLE #Test (ID int, Value int) 

INSERT INTO #Test VALUES (1,1) 
INSERT INTO #Test VALUES (1,2) 
INSERT INTO #Test VALUES (1,3) 
INSERT INTO #Test VALUES (2,1) 
INSERT INTO #Test VALUES (2,2) 
INSERT INTO #Test VALUES (3,1) 

そう= 3値のために、それはID = 1のため

ID   Value 
----------- ----------- 
1   3 
2   2 
3   1 

Becouseを返す必要があり、我々は値3持っており、他のために、私は私の与えられた入力3に最も近い値をしたいです。

編集:

だから、値= 2のためにそれが

ID   Value 
----------- ----------- 
1   2 
2   2 
3   1 
を返す必要があります
+0

ID = 2、値= 2を返しますが、ID = 1、値= 2を返さないのはなぜですか?どのように(2,2)*近づく(3)は(1,2)より3になるのでしょうか? – Filburt

+0

各IDについて、私はいくつかの値(1,2,3,4,5)を持っています。 IDごとに、私は入力に基づいて、1つの行だけを取得したい。私はその入力を見つけることができない場合(入力が大きい場合は、その特定のIDの値は、それに最も近いonを必要とします)。 – CiucaS

答えて

1

ただ、そうのようWHERE句にあなたの指定された値を使用してグループへのデータのセットをIDGROUP BYを使用し、最高値を取るためにMAXを使用して、データを制限:

DECLARE @val INT = 3 

CREATE TABLE #Test (ID int, Value int) 

INSERT INTO #Test VALUES (1,1) 
INSERT INTO #Test VALUES (1,2) 
INSERT INTO #Test VALUES (1,3) 
INSERT INTO #Test VALUES (2,1) 
INSERT INTO #Test VALUES (2,2) 
INSERT INTO #Test VALUES (3,1) 

SELECT ID , 
     MAX(Value) 
FROM #Test 
WHERE Value <= @val 
GROUP BY ID 

DROP TABLE #Test 
+0

私が与えることができる私の問題の一部を解決します。ありがとうございました! – CiucaS

0
SELECT ID ,MAX(VALUE) VALUE FROM #TEST 
    GROUP BY ID 

DECLARE @ID INT = 3 
SELECT ID ,MAX(VALUE) VALUE FROM #TEST 
WHERE ID <= @ID 
GROUP BY ID 

then this is also correct only 
+0

これを試すことができます – Chanukya

+0

これは常にmax(value)私は私のパラメーターまたはそれに最も近いものと等しい値を欲しい、私の編集を入力= 2でチェックします – CiucaS

+0

私はこれが彼が求めているとは思いません。私は彼が与えた例だと思う。それは良いことではありません。 – Denn

1

このgroup byを使用するときの制限であるIDとValue以外のデータフィールドを返すことができます。

Declare @Param Int = 2 

    ;With cteAssigned As 
    (
    Select ID, Value, 
      Row_Number() Over (Partition By ID Order By Value Desc) SortOrder 
     From #Test 
     Where Value <= @Param 
    ) 
    Select * From cteAssigned Where SortOrder = 1 

EDIT CTE なしだから今まであなたが探している価値をどのように@valueを変更@ParamのInt = 2

Select * 
    From 
     (
     Select ID, Value, 
       Row_Number() Over (Partition By ID Order By Value Desc) SortOrder 
      From #Test 
      Where Value <= @Param 
     ) A 
    Where SortOrder = 1 
+0

"テーブル"はすでにCTEテーブルであるため、実際にCTEを使用することはできません。でもありがとう。 – CiucaS

+0

努力をいただきありがとうございます、私は私の解決策を見つけました。 – CiucaS

0
CREATE TABLE #Test (ID int, Value int) 

INSERT INTO #Test VALUES (1,1) 
INSERT INTO #Test VALUES (1,2) 
INSERT INTO #Test VALUES (1,3) 
INSERT INTO #Test VALUES (2,1) 
INSERT INTO #Test VALUES (2,2) 
INSERT INTO #Test VALUES (3,1) 

DECLARE @Value INT = 0 

SELECT DISTINCT 
     t.ID, 
     ca_t.Value 
FROM #Test t 
CROSS APPLY 
    (SELECT TOP 1 t2.Value 
     FROM #Test t2 
     WHERE t2.ID = t.ID 
     ORDER BY ABS(t2.Value - @Value) 
    ) ca_t 

を宣言します。

関連する問題