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のフィールドが同じ日付(表中の最も早い日付)が含まれています。グループ内のすべてのレコードに適用されるように更新プログラムを取得するにはどうしたらよいですか?

+0

[相関サブクエリ](https://en.wikipedia.org/wiki/Correlated_subquery)を使用してください。 –

+0

UPDATEコンテキストでこれを使用する方法を教えてもらえますか? – globalSchmidt

答えて

1

あなたがして、グループを狭くする必要があります:あなたは、サブクエリでのことで、明示的にグループする必要はありません

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

。しかし、テーブルのすべてのタプルに対してサブクエリが実行されるため、遅い更新です。

+0

私の場合、「テーブル」と「T2」は同じものです。したがって、私は、 'table.user_email = T2.user_email'がうまく動作しないとは思っていましたが、そうしました! @dmgはそうだった:それは非常に遅いです。受け入れられる! – globalSchmidt

関連する問題