2016-10-28 2 views
0

목표를 그룹의 모든 행을 업데이트 - 각 사용자에 대한 업데이 트 모든 레코드를 해당 사용자에 대한 첫 번째 레코드의 값으로SQLite는 : 첫 번째 행에서 값

배경 - 나는 포스트 프로덕션 데이터베이스가 (즉 내가 할 수있는 12 개월 동안의 모든 사용자 상호 작용의 로그 인 데이터 수집 방식을 변경하지 않아야합니다. 분석을 위해 각 행에 해당 사용자가 데이터베이스에서 가장 먼저 나타나는 월 (yyyy-mm)을 태그로 지정하려고합니다. 새 필드 (first_use)는 해당 사용자의 첫 번째 레코드에있는 기존 필드 (월)에서 가져옵니다.

SELECT month,user_email, MIN(month) as first_month 
    FROM table 
    GROUP BY user_email 

이 나에게 테이블의 각 사용자에 대한 첫 번째 행 (첫 번째 트랜잭션)을 제공합니다 : 데이터베이스의 첫 번째 행을 선택

쉬운 부분이다.

제 질문은 UPDATE 문을 작성하는 방법입니다. 나는 이런 식으로 뭔가를하려고 할 때 :

UPDATE table set first_use = (
SELECT MIN(month) as first_month 
    FROM table 
    GROUP BY user_email) 

는 모든 first_use 필드는 같은 날짜 (테이블에있는 가장 빠른 날짜)를 포함한다. 해당 그룹의 한 달에 한 번에 한 그룹의 모든 레코드에 업데이트가 적용되도록하려면 어떻게합니까? 당신은 하위 쿼리에 의해 명시 적으로 그룹에 필요하지 않습니다

UPDATE table set first_use = (
    SELECT MIN(month) as first_month 
    FROM table T2 
    where table.user_email = T2.user_email 
    ) 

:

+0

[상관 하위 쿼리] (https://en.wikipedia.org/wiki/Correlated_subquery)를 사용하십시오. –

+0

UPDATE 컨텍스트에서 이것을 사용하는 방법을 보여 줄 수 있습니까? – globalSchmidt

답변

1

는 다음과 같은 방법으로 그룹을 좁힐 필요가있다. 그러나 테이블의 모든 튜플에 대해 하위 쿼리가 실행되므로 느린 업데이트입니다.

+0

필자의 경우 "테이블"과 "T2"는 하나이며 동일합니다. 그러므로 나는'table.user_email = T2.user_email'이 작동하지 않을 것이라고 완전히 예상 했었지만 그렇게했습니다! @dmg는 맞았습니다 : 매우 느립니다. 수락 됨! – globalSchmidt

관련 문제