복붙노트

[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. ==============================

    1.이 지역 및 귀하의 의견의 차이를 얻을 수 있도록 항상 긍정적 인, 다음 순서 오름차순 절대 값을 첫 번째 하나를 수행

    이 지역 및 귀하의 의견의 차이를 얻을 수 있도록 항상 긍정적 인, 다음 순서 오름차순 절대 값을 첫 번째 하나를 수행

    SELECT TOP 1 * FROM [myTable] 
    WHERE Name = 'Test' and Size = 2 and PType = 'p'
    ORDER BY ABS( Area - @input ) 
    
  2. ==============================

    2.의 라인을 따라 뭔가 끔찍한 :

    의 라인을 따라 뭔가 끔찍한 :

    ORDER BY ABS( Area - 1.125 ) ASC LIMIT 1
    

    아마도?

  3. ==============================

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

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

    5.

    SELECT * 
      FROM [myTable] 
      WHERE Name = 'Test' AND Size = 2 AND PType = 'p' 
      ORDER BY ABS(Area - 1.125)
      LIMIT 1
    

    - MarkusQ

  6. ==============================

    6.MySQL을 사용하는 경우

    MySQL을 사용하는 경우

    SELECT * FROM [myTable] ... ORDER BY ABS(Area - SuppliedValue) LIMIT 1
    
  7. ==============================

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

    8.최소 선택 여기서 [분야]> your_target_value 최대 [필드]

    최소 선택 여기서 [분야]> your_target_value 최대 [필드]

  9. from https://stackoverflow.com/questions/592209/find-closest-numeric-value-in-database by cc-by-sa and MIT license