1

假设我有一张记录价格历史的表格,例如:

 _______________________________________________________
|Make  | Model |  Year  |  price  |    date_of_record   |
|--------------------------------------------------------
|Mazda |   6   |  2008  | 10,000  | 2013-05-13 00:00:00 |
|Mazda |   6   |  2008  | 11,000  | 2012-05-13 00:00:00 |
|Mazda |   6   |  2008  | 12,000  | 2011-05-13 00:00:00 |
|Mazda |   6   |  2008  | 11,750  | 2010-05-13 00:00:00 |
|Honda | Civic |  2000  | 3,000   | 2011-05-13 00:00:00 |
|Honda | Civic |  2000  | 4,000   | 2010-05-13 00:00:00 |
|Honda | Civic |  2000  | 5,000   | 2009-05-13 00:00:00 |
|Honda | Civic |  2000  | 5,050   | 2008-05-13 00:00:00 |
|Acura |   TL  |  2009  | 21,000  | 2010-05-13 00:00:00 |
|--------------------------------------------------------

我想删除超过 2 年的条目,除非最新条目超过 2 年。很难用语言表达,基本上我想结束这个:

 _______________________________________________________
|Make  | Model |  Year  |  price  |    date_of_record   |
|--------------------------------------------------------
|Mazda |   6   |  2008  | 10,000  | 2013-05-13 00:00:00 |
|Mazda |   6   |  2008  | 11,000  | 2012-05-13 00:00:00 |
|Honda | Civic |  2000  | 3,000   | 2011-05-13 00:00:00 |
|Acura |   TL  |  2009  | 21,000  | 2010-05-13 00:00:00 |
|--------------------------------------------------------

因此查询将删除马自达超过两年的条目,以及本田和讴歌超过两年的条目,最新的除外。

只有在价格变化时才会将条目插入表中,因此如果价格在 5 年内没有变化,则条目将是 5 年,但这并不意味着数据不准确。

4

1 回答 1

2

首先,让我们获取所有汽车、品牌、型号、年份和各自最新的“记录日期”的列表。因此,您可以拥有一辆 2007 年的车辆和一辆相同品牌/型号的 2008 年车辆,每辆车的最新日期输入为 2011 年 1 月 1 日。您可能希望保留 2007 年和 2008 年车型的车辆条目,但是,您的示例仅显示旧日期只想分别保留本田思域和 Acural TL 的保留数据。

运行这个,只是为了确认这些结果

SELECT 
      c.`make`,
      c.`model`,
      c.`year`,
      MAX( c.date_of_record ) as LatestRecordDate
   from 
      YourCarPriceTable c
   group by
      c.`make`,
      c.`model`,
      c.`year`
   having
      MAX( c.date_of_record ) < DATE_ADD(CURDATE(),INTERVAL -2 YEAR)

现在,以此为基础,通过相同品牌、型号和年份的左连接从当前表中删除。允许删除的两个条件。
1)在“KeepThese”子查询中没有找到匹配项,并且最近的记录日期超过两年...

2) 在“KeepThese”子查询中找到一个匹配项,并且日期比符合 KeepThese(太旧)结果集的最新日期更早。

根据您的数据示例,“KeepThese”结果集应包括

Make   Model   Year   LatestRecordDate
Honda  Civic   2000   2011-05-13 00:00:00
Acura  TL      2009   2010-05-13 00:00:00

因此,您的 Mazda 6 将删除 2010 年和 2011 年日期条目的两个条目,因为该品牌/型号/年份不包含在列表中(通过测试 IS NULL)。

您的 Honda Civic 将删除所有早于其最新“KeepThese”值 2011-05-13 的条目,从而删除 2008、2009 和 2010 条目。

您的讴歌 TL 没有任何比它的单一条目更早的东西,所以它会被单独留下。

DELETE YPT.* FROM
   YourCarPriceTable YPT
      LEFT JOIN ( SELECT 
                        c.`make`,
                        c.`model`,
                        c.`year`,
                        MAX( c.date_of_record ) as LatestRecordDate
                     from 
                        YourCarPriceTable c
                     group by
                        c.`make`,
                        c.`model`,
                        c.`year`
                     having
                        MAX( c.date_of_record ) < DATE_ADD(CURDATE(),INTERVAL -2 YEAR) ) KeepThese
         ON YPT.`make` = KeepThese.`make`
         AND YPT.`model` = KeepThese.`model`
         AND YPT.`year` = KeepThese.`year`
   where
      (     KeepThese.`make` IS NULL
        AND YPT.date_of_record < DATE_ADD(CURDATE(),INTERVAL -2 YEAR))
      OR
      (      YPT.`make` = KeepThese.`make`
         AND YPT.`model` = KeepThese.`model`
         AND YPT.`year` = KeepThese.`year`
         AND YPT.date_of_record < KeepThese.LatestRecordDate )

子查询在前面处理一次,然后左连接到从您的汽车/价格表的版本中删除。

于 2013-05-14T17:08:59.673 回答