2017-12-04 11 views
0

ユーザーID、サブスクリプション終了日、プログラムIDを格納するサブスクリプションのテーブルがあります。 1人のユーザーは多くのプログラムを購読できますが、問題の範囲では最新の日付は購読の終了日と見なされます。目標は、毎月の毎月の購読が終了するユーザーの数を見つけることです。それを説明するために:mysqlの月間のグループ購読期間

------------------------------------------- 
| user_id | program_id | end_date  | 
------------------------------------------- 
| 1 |  1  | 2015-12-10  | 
| 1 |  2  | 2017-08-27  | 
| 2 |  1  | 2017-09-20  | 
| 3 |  2  | 2017-10-01  | 
| 2 |  3  | 2017-09-18  | 
| 5 |  12  | 2017-10-22  | 
| 4 |  3  | 2017-10-10  | 
| 3 |  8  | 2018-11-15  | 
------------------------------------------- 

中間結果のショーをサブスクリプションはユーザーごとにいつ終了する(月だけが必要とされている):

Select user_id, DATE_FORMAT(max(end_date), '%Y-%m') AS as enddate 
From subscription 
Group by user_id 
Order by end_date desc; 

:これは、クエリで達成された

------------------------------ 
| user_id | enddate  | 
------------------------------ 
| 1 | 2017-08  | 
| 2 | 2017-09  | 
| 3 | 2018-11  | 
| 4 | 2017-10  | 
| 5 | 2017-10  | 
------------------------------ 

最終結果では、リストをさらにフィルタリングする必要があり、毎月に何人のユーザがサブスクリプションを持たないのかを示すだけです(

0123)。
------------------------------ 
| count | month, year  | 
------------------------------ 
| 1 | 2017-08  | 
| 1 | 2017-09  | 
| 2 | 2017-10  | 
| 1 | 2018-11   | 
------------------------------ 

これは私がmysqlのアイデアで悩んでいる場所です。結果を反復し、数えることは疑問ではありません。

+0

、それは私の側の不注意なデータエントリーしました。ユーザーはプログラムで一度だけ購読してから、購読を更新します。この例ではデータを修正しました。 –

答えて

2

あなたはこのように、終了日で結果を並べる試みることができる:あなたが正しいです@strawberry

select count(user_id), DATE_FORMAT(max_end_date, '%Y-%m')as enddate 
    from (
     select user_id, max(end_date) as max_end_date 
     From subscription 
     Group by user_id 
    ) n 
    group by enddate 
    Order by enddate desc; 
+0

エイリアスに問題はありません。解決方法を見ていきます。スーパークエリで日付の書式設定を行う理由は何ですか? –

+0

@Strawberryありがとうございました。それを編集しました。 – dev8080

+0

@LazarusRising 5行の書式設定の違いは4つだけです。 – Strawberry

-2

はこれを試してみてください -

Select COUNT(*), DATE_FORMAT(MAX(end_date), '%Y-%m') AS as enddate 
From subscription 
Group by user_id 
Order by end_date desc; 
+0

ダウンボングの理由。 –

+0

アイデアは、各ユーザー(セットA)のend_dateを見つけて、各月に終了するサブスクリプションの数を調べることです(グループAは、日付の月に基づいて、セットBを与えます)。あなたのクエリは、mysqlで動作させない構文のクリーンアップの後に:各ユーザ(最大のend_dateを持つもの)に対して1つのレコードを選択し、日付を%Y-%mとしてフォーマットします。だから私たちは集合Aを残しています。これを数ヶ月間に分けてBを設定することはできません。 –

関連する問題