2015-02-02 3 views
1

단일 SQLite 쿼리를 어떻게 조합하여 다음을 수행 할 수 있는지 잘 모르겠습니다. 나는 비트와 조각을 작동시킬 수는 있지만, 모든 것을 하나의 단일 것으로 융합하는 것처럼 보일 수는 없다.그룹화 된 행이 중복 된 여러 열의 SQLite SELECT 쿼리

| ID | ColumnA | ColumnB | ColumnC | ColumnD | 
| 1 | 21 | 34 | 10 | 0.12654 | 
| 2 | 21 | 34 | 20 | 0.25478 | 
| 3 | 21 | 46 | 10 | 0.43564 | 
| 4 | 21 | 46 | 20 | 1.02487 | 
| 5 | 34 | 21 | 10 | 0.01476 | 
| 6 | 34 | 21 | 20 | 0.87265 | 
| 7 | 34 | 46 | 10 | 0.46478 | 
| 8 | 34 | 46 | 20 | 0.13665 | 
| 9 | 46 | 21 | 10 | 0.04189 | 
| 10 | 46 | 21 | 20 | 0.91754 | 
| 11 | 46 | 34 | 10 | 0.73688 | 
| 12 | 46 | 34 | 20 | 0.24299 | 

이 데이터는 내가 수행하고있어 일부 시뮬레이션 중첩 할 - 루프에 의해 생성됩니다

나는 (실제 데이터 세트가 몇 GB입니다)이 보이는 테이블이있다.

이 표에서 필자는 색/히트 맵을 플로팅 할 수 있도록 다음과 같은 표를 추출해야합니다. COLUMNA 및 COLUMNB의 값이 소정의 행에 대해 동일 결코 같이

| ID | ColumnA | ColumnB | ColumnC | ColumnD | 
| 1 | 21 | 34 | 10 | 0.12654 | 
| 3 | 21 | 46 | 10 | 0.43564 | 
| 5 | 34 | 21 | 10 | 0.01476 | 
| 8 | 34 | 46 | 20 | 0.13665 | 
| 9 | 46 | 21 | 10 | 0.04189 | 
| 12 | 46 | 34 | 20 | 0.24299 | 

그래서이 2 차원 배열을 사용 ColumnD 값에 기초하여 컬러 맵을 나를 수있게 (대각는 0으로 설정되어야한다 때문에 대각선에 대한 데이터) 데이터베이스에 존재하지 않는 :

| 21 | 34 | 46 
------------------ 
21 | 0 | | 
------------------ 
34 | | 0 | 
------------------ 
46 | | | 0 

내 질문은 내가 칼라 맵을 생성하기 위해 2 차원 배열로가는 모든 데이터를 집계 할 수있는 단일 쿼리를 설정하는 방법 기본적으로.

ColumnA와 ColumnB는 기본적으로 동일한 정수 집합으로 채워지는 것이 중요합니다. DISTINCT를 사용하여 고유 한 정수 값 목록을 얻을 수 있습니다. 여러 열에 걸쳐 DISTINCT를 선택하는 것에 대한 몇 가지 SO 스레드를 찾았으나 예제에서는 집계를 사용하여 다른 열의 값을 선택하는 방법을 보여주지 않습니다. 이 경우, columnA와 ColumnB의 각 ID 쌍에 대해 ColumnD의 최소값을 선택하려면 min()을 사용합니다. 고유 한 좌표 쌍 (ColumnA, ColumnB)이므로 단일 열에서 DISTINCT를 선택해도 작동하지 않습니다.

도움이 될 것입니다.

+0

원본 테이블에서 추출한 테이블로 이동하는 방법이 명확하지 않습니다. 이 둘은 완전히 똑같습니다. 당신의 기준은 무엇입니까? –

+0

죄송합니다. 아마도 텍스트가 손실되었을 수 있습니다. 기준은 ColumnD의 최소값 인 각 (ColumnA, ColumnB) 쌍을 선택합니다. – kartikkumar

답변

1

를, 그것은 본다 및 ColumnB 쌍에 대해서는 ColumnD입니다. 당신이 id 또는 ColumnC, 신경 쓰지 않는 경우 간단한 group by 충분하다 : 당신이 행의 모든 ​​값을 필요로 할 경우

select ColumnA, ColumnB, min(ColumnD) 
from table t 
group by ColumnA, ColumnB; 

, 다시 join 그들에게 얻을 수 있습니다

select t.* 
from table t join 
    (select ColumnA, ColumnB, min(ColumnD) as ColumnD 
     from table t 
     group by ColumnA, ColumnB 
    ) tt 
    on t.ColumnA = tt.ColumnA and t.ColumnB = tt.ColumnB and 
     t.ColumnD = tt.ColumnD; 

여기에 은 ColumnAColumnB의 값에 대해서는 절대 복제되지 않는다고 가정합니다.

+0

우수! 나는 그룹 별 특징을 보았다. 원하는대로 작동하는 것 같습니다.'ColumnD'는 부동 소수점 정밀도까지 저장하기 때문에 중복되지 않아야하며 두 시뮬레이션이 정확히 같은 값을 얻지는 않습니다. 충돌이있을 가능성이 낮 으면 '분'이 오류를 던집니까? – kartikkumar

+0

@ kartikkumar. . . 전혀. 출력에서 최소 값을 갖는 모든 행을 가져옵니다. –

+0

좋아요! 그게 작동, 나는 DISTINCT를 사용하여 하나의 행만 선택되도록 할 수 있다고 생각합니다. – kartikkumar

0

당신은 그룹 BY 절 당신이 행을 대조하고에 집계 계산을 수행 할 필드 그룹을 사용할 수 있어야합니다 : 당신의 최소값을 원하는처럼 나에게

SELECT ColumnA, ColumnB, Min(ColumnC), Min(ColumnD) 
FROM Table1 
GROUP BY ColumnA, ColumnB 
+0

원하는 결과의 마지막 예제에서는이 작업을 수행 할 수 없습니다. –

+0

사실입니다. 죄송 합니다만, 나는 원하는 결과를 자세히 보지 못했습니다. –

관련 문제