4

2 つのプロパティを持つアイテムを格納するテーブルがあります。したがって、テーブルには 3 つの列があります。

 item_id  |  property_1  |  property_2  |  insert_time
  1       |   10         |  100         |  2012-08-24 00:00:01
  1       |   11         |  100         |  2012-08-24 00:00:02
  1       |   11         |  101         |  2012-08-24 00:00:03
  2       |   20         |  200         |  2012-08-24 00:00:04
  2       |   20         |  201         |  2012-08-24 00:00:05
  2       |   20         |  200         |  2012-08-24 00:00:06

つまり、アイテムのいずれかのプロパティが変更されるたびに、新しい行が挿入されます。挿入時間を格納する列もあります。今私は変更の数を取得したいと思いますproperty_2。上の表の場合、取得する必要があります

item_id  |  changes_in_property_2
 1       |    2
 2       |    3

どうすればこれを入手できますか?

4

4 に答える 4

0

私の見解:

SELECT 
    i.item_id,
    SUM(CASE WHEN i.property_1 != p.property_1 THEN 1 ELSE 0 END) + 1
      AS changes_1,
    SUM(CASE WHEN i.property_2 != p.property_2 THEN 1 ELSE 0 END) + 1
      AS changes_2
FROM items i
LEFT JOIN items p
  ON p.time = 
    (SELECT MAX(q.insert_time) FROM items q 
        WHERE q.insert_time < i.insert_time AND i.item_id = q.item_id)
GROUP BY i.item_id;

で選択されていないアイテムごとに1つのエントリがあり、前のエントリはありませんi。ただし、変更はカウントされます。そのため、合計が増分されます。

于 2012-08-24T21:30:42.543 に答える
0

これにより、入力された個別の値の数がわかります。ただし、以前の値に戻された場合は、新しい変更としてカウントされません。データの年表がなければ、それ以上のことを行うのは困難です。

select item_id, count(distinct property_2)
from Table1
group by item_id
于 2012-08-24T20:17:50.033 に答える
0

これがあなたの望む結果に最も近いものです。property_2ただし、に基づいてへの変更の数を求めていることに注意してくださいitem_id。これらの 2 つの列を厳密に分析している場合、1 に対してはitem_id1 つの変更しかなく、2 に対しては2 つの変更しかありitem_idませんproperty_1。うまくいけば、このフィドルがその理由を示してくれます。

SELECT a.item_id,  
  SUM(
    CASE 
      WHEN a.property_2 <> 
        (SELECT property_2 FROM tbl b 
          WHERE b.item_id = a.item_id AND b.insert_time > a.insert_time LIMIT 1) THEN 1
      ELSE 0
    END) AS changes_in_property_2
FROM tbl a
GROUP BY a.item_id
于 2012-08-24T21:22:22.460 に答える