Mysql 如何通过SQL中的一组行执行重复数据消除

Mysql 如何通过SQL中的一组行执行重复数据消除,mysql,sql,Mysql,Sql,假设我有一个名为“库存”的表格,每天我都会列出每个项目及其数量 inventory --------------------- day | item | quantity 1 Apples 5 1 Oranges 3 2 Apples 5 2 Oranges 3 3 Apples 5 3 Oranges 3 3 Peaches 8 4 Apples 5 4 Oranges 3 4 Peaches 8 5

假设我有一个名为“库存”的表格,每天我都会列出每个项目及其数量

inventory
---------------------
day | item | quantity
1    Apples   5
1    Oranges  3
2    Apples   5
2    Oranges  3
3    Apples   5
3    Oranges  3
3    Peaches  8
4    Apples   5
4    Oranges  3
4    Peaches  8
5    Apples   2
5    Oranges  3
5    Peaches  8
通过重复数据消除,我想消除与前一天数据完全相同的任何一天。因此,生成的表应该如下所示:

inventory
---------------------
day | item | quantity
1    Apples   5
1    Oranges  3
3    Apples   5
3    Oranges  3
3    Peaches  8
5    Apples   2
5    Oranges  3
5    Peaches  8
SELECT
  i.day, i.item, i.quantity
FROM (
  SELECT t1.day, t1.item, t1.quantity, MAX(t2.day) as prec_day
  FROM
    inventory t1 LEFT JOIN inventory t2
    ON t1.item=t2.item AND t1.day>t2.day
  GROUP BY
    t1.day, t1.item, t1.quantity) i
  LEFT JOIN inventory i2
  ON i.item=i2.item AND i.prec_day=i2.day
WHERE
  i2.day IS NULL or i.quantity<>i2.quantity

有什么办法吗?

我相信:

Select day, (Select Item, Quantity From tables Where Criteria) From tables Where Criteria Group By Day.

可能有效

以下解决方案使用协调子选择

select day, item, quantity
from yourTable t
where quantity <> ( select quantity from yourTable y where y.day = t.day - 1 and y.item = t.item )
至少在我理解这个问题时,它已经测试过了,并且可以正常工作。

您可以使用左连接查找与前一天相同的库存项目,并在WHERE子句中排除它们。这是一本书


如果你想考虑一些缺失的日子,你可以使用这样的查询:

inventory
---------------------
day | item | quantity
1    Apples   5
1    Oranges  3
3    Apples   5
3    Oranges  3
3    Peaches  8
5    Apples   2
5    Oranges  3
5    Peaches  8
SELECT
  i.day, i.item, i.quantity
FROM (
  SELECT t1.day, t1.item, t1.quantity, MAX(t2.day) as prec_day
  FROM
    inventory t1 LEFT JOIN inventory t2
    ON t1.item=t2.item AND t1.day>t2.day
  GROUP BY
    t1.day, t1.item, t1.quantity) i
  LEFT JOIN inventory i2
  ON i.item=i2.item AND i.prec_day=i2.day
WHERE
  i2.day IS NULL or i.quantity<>i2.quantity
请看小提琴

编辑:如果需要在至少有一个更改时显示所有项目,可以使用以下选项:

SELECT
  inventory.*
FROM
  inventory
WHERE
  day IN (
    SELECT
      i.day
    FROM (
      SELECT t1.day, t1.item, t1.quantity, MAX(t2.day) as prec_day
      FROM
        inventory t1 LEFT JOIN inventory t2
        ON t1.item=t2.item AND t1.day>t2.day
      GROUP BY
        t1.day, t1.item, t1.quantity) i
      LEFT JOIN inventory i2
      ON i.item=i2.item AND i.prec_day=i2.day
    WHERE
      i2.day IS NULL or i.quantity<>i2.quantity)

Fiddle是。

hmm,如果我每天都有数据,这就行了。可能有几天我会丢失数据。所以,如果第7天和第8天不见了,第9天应该对照第6天来检查它是否是重复的。你想要的结果包括3,苹果,5。该行和其他行是否符合您的期望结果?因为前一天还有第二排,苹果,第五排。是的,应该是这样。因为第3天有变化,第3天的每一行都应该在结果集中。OP在回答了一些问题后更改了问题。唯一的问题是我正在尝试一天一天地去重复,而不是一行一行地去重复。请注意您的结果集和我想要的结果集之间的差异。这看起来是正确的,尽管现在我正试图弄清楚这是如何工作的,以便我可以将其应用到我的实际问题中,这有点复杂。非常感谢。