2

3 つの列を持つログを含むデータベース テーブルがあります。

date | status | projectId

ステータスは 0 または 1 のいずれかです。主キーは日付とプロジェクト ID です。

projectID が最後に 1 になってからステータスが 0 になった回数を調べようとしています。

projectId が 1 つしかない場合

date | status | projectId
  1       0        3
  2       0        3
  3       1        3
  4       1        3
  5       0        3
  6       0        3

これは 2 を返す必要があります (5 行目と 6 行目は 0 で、4 行目は 1 です)

私にとって難しいのは、日付の順序を維持しなければならないことです。このような問題、特にこの問題に取り組む良い方法は何でしょうか?

4

3 に答える 3

4

1 つのプロジェクトでこれを行う方法は次のとおりです。

select count(*)
from logs l
where status = 0 and
      projectid = 3 and
      date > (select max(date) from logs where projectid = 3 and status = 1)

すべてのプロジェクトでこれを行う方法は次のとおりです。

select l.projectId, count(l1.projectId)
from logs l left outer join
     (select projectId, max(date) as maxdate
      from logs
      where status = 1
      group by projectId
     ) l1
     on l.projectId = l1.projectId and
        l.date > l1.date and
        l.status = 0
group by l.projectId;
于 2013-08-15T22:13:11.593 に答える
0

すべての project_id の結果を取得する 1 つの方法を次に示します。

SELECT m.project_id
     , COUNT(1) AS mycount
  FROM ( SELECT l.project_id
              , MAX(l.date) AS latest_date
           FROM mytable l
          WHERE l.status = 1
       ) m
  JOIN mytable t
    ON t.project_id = m.project_id 
   AND t.date > m.latest_date
   AND t.status = 0

project_id のサブセットのみが必要な場合は、述語をインライン ビュー クエリの WHERE 句に追加する必要があります。

          WHERE l.status = 1
            AND l.project_id IN (3,5,7)

編集

最新の status=1 行の後に status=0 行がない場合、そのクエリは行を返しません。ゼロ カウントを返すには、外部結合を使用します。

SELECT m.project_id
     , COUNT(t.status) AS mycount
  FROM ( SELECT l.project_id
              , MAX(l.date) AS latest_date
           FROM mytable l
          WHERE l.status = 1
            AND l.project_id IN (3)
       ) m
  LEFT
  JOIN mytable t
    ON t.project_id = m.project_id 
   AND t.date > m.latest_date
   AND t.status = 0

project_id最適なパフォーマンスを得るために、文は先頭に and の列がありdate(この順序で)、その列を含むインデックスを使用できstatusます。たとえば、

ON mytable (`project_id`,`date`,`status`)
于 2013-08-15T22:18:20.470 に答える
0

ここでは、1 つの選択だけでオプションを選択できます。

http://sqlfiddle.com/#!2/6ce87/11

select *
from logs
where status=0 and date > (select date from logs where status=1 order by date desc limit 1)
于 2013-08-15T22:20:34.257 に答える