0

だから私は次の会員履歴表を持っています

User_ID  |  Start date  |  End Date  |  Type(0-7) |  
--------------------------------------------------
    2    |   date1      |  date2     |    0       |  
--------------------------------------------------
    2    |   date3      |  date4     |    3       |  
--------------------------------------------------
    2    |   date5      |  date6     |    3       |  
--------------------------------------------------
    2    |   date7      |  date8     |    1       |  
--------------------------------------------------
    3    |   date9      |  date10    |    6       |  
--------------------------------------------------
    3    |   date11     |  date12    |    0       |  
--------------------------------------------------

結果でmysqlクエリを作成しようとしています:

    User_ID  |  Start date  |  End Date  |  Type(0-7) |PrevEnd-CurStart| Prevtype    
    ----------------------------------------------------------------------------------
        2    |   date1      |  date2     |    0       |  null OR 0     | null OR 0
    ----------------------------------------------------------------------------------
        2    |   date3      |  date4     |    3       |  Date3-Date2   |  0
    ----------------------------------------------------------------------------------
        2    |   date5      |  date6     |    3       |  Date5-Date4   |  3
    ----------------------------------------------------------------------------------
        2    |   date7      |  date8     |    1       |  Date7-Date6   |  3
    ----------------------------------------------------------------------------------
        3    |   date9      |  date10    |    6       |  null Or 0     |  null OR 0
    ----------------------------------------------------------------------------------
        3    |   date11     |  date12    |    0       |  Date11-Date10 |  6
    ----------------------------------------------------------------------------------

その時点からどちらの方法でも作業できるため、Nullまたは0を入力しました

そのためのmysqlクエリを作成するにはどうすればよいですか?これは私が必要とするレポートの単なるサブクエリであり、昨日、昨夜、そして今日、一日中それを続けてきました。本当に助けていただければ幸いです。これは月に1回だけ実行する必要があるため、実行時間との関連性はほとんどありません。

編集:現在の出力を取得するには、次を使用します。'group by 1,2,3,4'は、多くの重複を取り除く必要があるためです。

select 
 mh.account_id, 
 mh.start_date, 
 mh.end_date, 
 mh.`type`
from tbl_membership_history mh join tbl_membership m on mh.account_id=m.account_id
group by 1,2,3,4
order by 1,2,3,4
limit 100
4

1 に答える 1

2

以前のレコードを使用してテーブルに自己結合し、集計して、それらの以前のレコードの終了日(前の終了を与える)の最新のものを見つけることができます。Type次に、前のレコードのを見つけるために、その結​​果をさらにテーブルに結合する必要があります。

SELECT   res.*, prv.Type AS prvType
FROM (
  SELECT   cur.*, MAX(bef.endDate) AS prvEnd
  FROM     history AS cur LEFT JOIN history AS bef
        ON bef.User_ID = cur.User_ID AND bef.endDate <= cur.startDate
  GROUP BY cur.User_ID, cur.startDate, cur.endDate, cur.Type
) res LEFT JOIN history AS prv
        ON prv.User_ID = res.User_ID AND prv.endDate = res.prvEnd

sqlfiddleでそれを参照してください。

于 2012-10-19T14:41:43.280 に答える