[SQL] 데이터베이스에서 가장 가까운 숫자 값을 찾기
SQL데이터베이스에서 가장 가까운 숫자 값을 찾기
나는 정확히 일치하는 항목이 발견되지 않는 경우 정확히 내 입력과 일치하는 레코드 또는 가장 가까운 하나를 반환하는 SELECT 문을 찾을 필요가있다.
여기 내 선택 문은 지금까지입니다.
SELECT * FROM [myTable]
WHERE Name = 'Test' AND Size = 2 AND PType = 'p'
ORDER BY Area DESC
내 입력이 1.125이고 데이터베이스가 2, 1.5, 1를 포함하고 0.5 쿼리가 기록이 1을 포함하는 반환합니다 그렇다면 내가 뭘해야는 '지역'필드에 가장 가까운을 찾을 수 있습니다.
어떤 도움을 주시면 감사하겠습니다 그래서 내 SQL 능력은 매우 제한됩니다.
해결법
-
==============================
1.이 지역 및 귀하의 의견의 차이를 얻을 수 있도록 항상 긍정적 인, 다음 순서 오름차순 절대 값을 첫 번째 하나를 수행
이 지역 및 귀하의 의견의 차이를 얻을 수 있도록 항상 긍정적 인, 다음 순서 오름차순 절대 값을 첫 번째 하나를 수행
SELECT TOP 1 * FROM [myTable] WHERE Name = 'Test' and Size = 2 and PType = 'p' ORDER BY ABS( Area - @input )
-
==============================
2.의 라인을 따라 뭔가 끔찍한 :
의 라인을 따라 뭔가 끔찍한 :
ORDER BY ABS( Area - 1.125 ) ASC LIMIT 1
아마도?
-
==============================
3.당신이 많은 이름, 크기에 술어를 충족시키는 행, 및 p 형 열이 경우에 당신은 당신의 쿼리에서 지역 열에 범위 술어를 포함 할 수 있습니다. 지역 열이 인덱스의 경우이 효율적인 색인 기반 액세스를 허용 할 수 있습니다.
당신이 많은 이름, 크기에 술어를 충족시키는 행, 및 p 형 열이 경우에 당신은 당신의 쿼리에서 지역 열에 범위 술어를 포함 할 수 있습니다. 지역 열이 인덱스의 경우이 효율적인 색인 기반 액세스를 허용 할 수 있습니다.
다른 분기 최대 영역 <대상으로 기록을 발견하면서 (오라클 구문을 사용하여 작성) 다음 쿼리는 최소한의 지역> = 대상으로 기록을 찾기 위해 UNION ALL 중 한 가지를 사용합니다. 이 두 기록 중 하나는 당신이 찾고있는 기록이 될 것이다. 그럼 당신은 ORDER BY ABS 수 있습니다 (지역 - 입력) 두 후보의 승자를 선택합니다. 불행하게도 쿼리가 우선 순위에 의해 원하는 ROWNUM / ORDER를 시행하는 데 필요한 중첩 된 SELECTS 복잡한 인한입니다.
SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM [myTable] WHERE Name = 'Test' AND Size = 2 AND PType = 'p' AND Area >= ?target ORDER BY Area) WHERE ROWNUM < 2 UNION ALL SELECT * FROM (SELECT * FROM [myTable] WHERE Name = 'Test' AND Size = 2 AND PType = 'p' AND Area < ?target ORDER BY Area DESC) WHERE ROWNUM < 2) ORDER BY ABS(Area - ?target)) WHERE rownum < 2
이 쿼리에 대한 좋은 지표가 예상되는 쿼리 실행 계획은 각각 하나의 행을 반환 된 두 개의 인덱스 범위 스캔을 기반으로 될 수있는 경우 (이름, 크기, P 형, 지역)이 될 것입니다.
-
==============================
4.어떻게 같은 사용자의 입력과 [지역]의 차이에 의한 주문에 대해 :
어떻게 같은 사용자의 입력과 [지역]의 차이에 의한 주문에 대해 :
DECLARE @InputValue DECIMAL(7, 3) SET @InputValue = 1.125 SELECT TOP 1 * FROM [myTable] WHERE Name = 'Test' AND Size = 2 AND PType = 'p' ORDER BY ABS(@InputValue - Area)
-
==============================
5.
SELECT * FROM [myTable] WHERE Name = 'Test' AND Size = 2 AND PType = 'p' ORDER BY ABS(Area - 1.125) LIMIT 1
- MarkusQ
-
==============================
6.MySQL을 사용하는 경우
MySQL을 사용하는 경우
SELECT * FROM [myTable] ... ORDER BY ABS(Area - SuppliedValue) LIMIT 1
-
==============================
7.ABS ()가 거의 모든 지원하고 있지만, 그것은 (적어도 SQL99에) 기술적 표준이 아니다 있습니다. 당신이 어떤 이유로 ANSI 표준 SQL을 작성해야하는 경우, 당신은 CASE 연산자와 함께 문제를 해결해야 할 것이다 :
ABS ()가 거의 모든 지원하고 있지만, 그것은 (적어도 SQL99에) 기술적 표준이 아니다 있습니다. 당신이 어떤 이유로 ANSI 표준 SQL을 작성해야하는 경우, 당신은 CASE 연산자와 함께 문제를 해결해야 할 것이다 :
SELECT * FROM myTable WHERE Name='Test' AND Size=2 AND PType='p' ORDER BY CASE Area>1.125 WHEN 1 THEN Area-1.125 ELSE 1.125-Area END
-
==============================
8.최소 선택 여기서 [분야]> your_target_value 최대 [필드]
최소 선택 여기서 [분야]> your_target_value 최대 [필드]
from https://stackoverflow.com/questions/592209/find-closest-numeric-value-in-database by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 합니까 MySQL은 MSSQL처럼 @@ ROWCOUNT에 해당하는가? (0) | 2020.04.14 |
---|---|
[SQL] 어떻게 SQL 서버의 저장 프로 시저 매 시간마다 실행? (0) | 2020.04.14 |
[SQL] SQL WHERE 절 후행 공백 매칭 값 (0) | 2020.04.14 |
[SQL] 값 당 COUNT에 의해 주문 (0) | 2020.04.14 |
[SQL] 펑션에서 저장 프로 시저를 실행합니다 (0) | 2020.04.14 |