4

我有一个存储具有两个属性的项目的表。所以该表有三列:

 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

这是我能达到您想要的结果的最接近的结果。但是,我应该注意,您要求property_2基于item_id. item_id如果您正在严格分析这两列,那么1 和 2只有 1个更改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 回答
0

我会这样做,使用用户定义的变量来跟踪前一行的值。

SELECT item_id, MAX(c) AS changes_in_property_2
FROM (
    SELECT IF(@i = item_id, IF(@p = property_2, @c, @c:=@c+1), @c:=1) AS c, 
        (@i:=item_id) AS item_id,
        (@p:=property_2) 
    FROM `no_one_names_their_table_in_sql_questions` AS t,
    (SELECT @i:=0, @p:=0) AS _init
    ORDER BY insert_time
) AS sub
GROUP BY item_id;
于 2014-09-19T20:30:17.793 回答
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;

中未选择的每个项目都有一个条目,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 回答