2012-09-11 2 views
1

MS-Access 데이터베이스에 ABC라는 테이블이 있다고 가정 해 보겠습니다.데이터베이스에서 서로 수치 적으로 가까운 항목 선택

이 표에는 여러 개의 열이 있지만이 질문에 대해서는 두 개의 열만 있습니다 ("Hugo_symbol"및 "Start_position"). "Hugo_Symbol"은 유전자 명을 가지고 있고 여러 행은 동일한 Hugo_symbol을 가질 수 있습니다 -이 열은 중복 된 항목을 가짐을 의미합니다. "START_POSITION는"숫자를 가지고 - 나는 START_POSITION 서로 20 내) 1) 같은 Hugo_Symbol 및 2를 가지고 테이블 ABC에서 라인을 반환하는 쿼리를 구축하고자 1000 100000000

에 아무것도.

예를 들어

. 쿼리가 반환해야합니다,

Hugo_Symbol   Start_Position 

TP53      987654 
TP53      987660 
TP53      987662 
APOB      12345 
APOB      12350 
APOB      12359 

이 라인은 같은 Hugo_Symbol을 가지고 START_POSITION가 서로의 20 이내이기 때문이다.

그런 쿼리가 가능합니까? 그렇다면 SQL 코드는 무엇입니까?

+0

'Start_Position'은 (는) _what_? 가치가 전달 되었습니까? 다른 행 (같은'Hugo_Symbol')? ['APOB','12330']을 포함하는 행이 포함됩니까? ['APOB','12325']는 어떨까요? _starting_ 데이터를 얻을 수 있습니까? 어떤 버전의 Access입니까? –

+0

액세스 2000. "서로"중 20 이내. 동일한 Hugo_Symbol을 가진 다른 모든 행. 예, {APOB 12345}는 {APOB 12345}의 20 분의 2 내에 있기 때문에 포함됩니다. {APOB 12325} ..와 같은 'Starting data'? –

+0

@Shyam_LA - 결과를 얻으려는 표의 데이터 - 여기에는 포함되지 않을 것으로 예상되는 행이 포함되어야합니다. 즉, 한스 (Hans)는 요점이 있습니다. 당신은 정말로이 일에 약간의 노력을 기울여야합니다. 처음에는 이것이 OLAP 기능을 필요로 할지도 모른다고 생각했지만 (성능상의 이유로 선호 될 수도 있음), 나도 안타깝습니다. –

답변

3

저는 Access를 사용하지 않지만 ANSI SQL을 사용하여 접근하는 방법입니다.

SELECT 
    * 
FROM 
    ABC AS first 
INNER JOIN 
    ABC AS second 
    ON second.Hugo_Symbol  = first.Hugo_Symbol 
    AND second.Start_Position <= first.Start_Position + 20 
    AND second.Start_Position > first.Start_Position 

잠재적으로 예상 예상보다 많은 데이터, 그리고 잠재적으로 다른 형식을 반환합니다.

First.Hugo_Symbol First.Start_Position Second.Hugo_Symbol Second.Start_Position 
    TP53    987654    TP53    987660 
    TP53    987654    TP53    987662 
    TP53    987660    TP53    987662 
    APOB    12345     APOB    12350 
    APOB    12350     APOB    12359 
    APOB    12350     APOB    12359 

편집 :

대답은 위에서 매우 "서로"와 영향이다. 당신이 "다른 레코드가 자신의 위치 (20)와 같은 기호와 위치에 존재하는 모든 레코드"로 요구 사항을 개혁하면

당신은 ... 같은

SELECT 
    * 
FROM 
    ABC  AS data 
WHERE 
    EXISTS (SELECT * 
      FROM ABC AS lookup 
      WHERE lookup.hugo_symbol  = data.hugo_symbol 
      AND lookup.start_position >= data.start_position - 20 
      AND lookup.start_position <= data.start_position + 20 
      AND lookup.start_position <> data.start_position 
     ) 

뭔가를 얻을 수 그러나 ACCESS2000은 더 내가 일반적으로 사용하는 데이터베이스를 제한했다. 나는 Access2000이 할 수 있고 할 수없는 것을 모른다.

+0

두 번째 코드는 완벽하게 작동합니다. 내가 뭘 찾고 있었는지 정확하게 알려주지.하지만 한 가지 문제가있다. 같은 Hugo_Symbol을 가진 모든 항목을 함께 나열하고 싶다. 내 테이블은 현재 25000 개의 항목을 가지고 있으며 쿼리는 1200 개의 항목을 반환하지만 그룹화가 부족하기 때문에 쿼리를 이해하기 어렵습니다.자동으로 그룹화 할 수 있습니까? 감사! –

+0

@shyam_LA :'ORDER BY data.hugo_symbol, data.start_position'을 추가하십시오 – MatBailie

+0

완벽! 고마워요. –

2
SELECT ABC.Hugo_Symbol, ABC.Start_Position, ABC_1.Start_Position 
FROM ABC INNER JOIN ABC AS ABC_1 ON 
    ABC.Hugo_Symbol = ABC_1.Hugo_Symbol AND 
    ABC.Start_Position + 20 >= ABC_1.Start_Position AND 
    ABC.Start_Position < ABC_1.Start_Position 
+0

@Dems가 저를 때리는 것 같습니다. 부팅에 대한보다 매끄러운 응답으로. – mwolfe02

+0

예, 코드가 트릭을 수행합니다! 고맙습니다.. –

관련 문제