0

次のようなテーブルがあります。

+---------+------------+----------+
| User_id | start_date | end_date |
+---------+------------+----------+
| 123     | 1/1/2015   | 3/1/2015 |
| 234     | 1/1/2015   | 1/1/2015 |
| 345     | 2/1/2015   | 3/1/2015 |
| 456     | 3/1/2015   | 3/1/2015 |
| :       |            |          |
| :       |            |          |
+---------+------------+----------+

出力は次のようになります。

Months_since_live

+-------------+---+---+---+---+
|             | 0 | 1 | 2 | 3 |
+-------------+---+---+---+---+
| Jan_signups | 2 | 1 | 1 | 0 |
| Feb_signups | 1 | 1 | 0 |   |
| Mar_signups | 1 | 0 |   |   |
| :           |   |   |   |   |
| :           |   |   |   |   |
+-------------+---+---+---+---+
4

1 に答える 1

0

データを追跡する新しい保持期間ごとに新しい列を追加する必要があるため、これは通常、出力に適した形式ではありません。たとえば、4 月に 1 月のサインアップがまだ残っているかどうかを知りたい場合は、出力に「4」列を追加する必要があります。

より良い出力は、month_of_signup、months_active、users_retained (count) であり、心ゆくまでピボットできます。

start_date を月に集計するか、文字列に変換する必要がある場合は、select と group by の両方に追加できます。

元の出力が本当に必要な場合:

select concat(date_format(start_date, '%b'),'_signups') as month,
sum(if(timestampdiff(month, start_date, end_date) >= 0, 1, 0) as '0',
sum(if(timestampdiff(month, start_date, end_date) >= 1, 1, 0) as '1',
sum(if(timestampdiff(month, start_date, end_date) >= 2, 1, 0) as '2',
sum(if(timestampdiff(month, start_date, end_date) >= 3, 1, 0) as '3'
from your_table
group by month

ただし、次の年が来て、テーブルに 2 つの 1 月があると、これは非常に混乱するでしょう。出力と集計にも年を追加することをお勧めします。

于 2015-08-18T19:28:53.327 に答える