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在回答了一些问题后更改了问题。唯一的问题是我正在尝试一天一天地去重复,而不是一行一行地去重复。请注意您的结果集和我想要的结果集之间的差异。这看起来是正确的,尽管现在我正试图弄清楚这是如何工作的,以便我可以将其应用到我的实际问题中,这有点复杂。非常感谢。