MYSQL单表中MAX和MIN之间的时差

时间:2012-01-24 00:19:53

标签: mysql max min

我有一个如下所示的表格,我正在尝试获取特定Id的MAX和MIN值,但前提是MAX输入日期大于MIN输入日期。

表:

ID  ENTRY_DATE              NAME       PRICE
1   2012-01-23 16:09:35     MONKEY     99.33
2   2012-01-23 11:04:09     MONKEY     97.65
3   2012-01-23 09:31:19     MONKEY     93.05
4   2012-01-23 15:12:14     DICE       30.49
5   2012-01-23 12:01:24     DICE       32.00
6   2012-01-23 08:01:24     DICE       31.00

所以我想要做的是当MAX(价格)entry_date大于MIN(价格)entry_date时,获取MAX(价格)和MIN(价格)。从上表中,我的结果将是:

NAME      MaxPrice     MinPrice   PriceDiff   
MONKEY    99.33        93.05      6.28

'Dice'不会显示,因为MAX日期/时间发生在MIN之前。

我尝试过LEFT JOIN,但我似乎无法弄明白。这就是我现在所拥有的,但它显然抓住了所有结果,因为我似乎无法弄清楚如何比较参赛日期......

SELECT name,
MAX(price) as MaxPrice,
MIN(price) as MinPrice,
MAX(price)-MIN(price) AS PriceDiff,
FROM products
WHERE DATE(entry_date) = DATE(NOW()) 
GROUP BY name
ORDER BY PriceDiff DESC

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

要选择每组的最高价格(以及与之对应的日期),请执行以下操作:

SELECT p.NAME, p.ENTRY_DATE as dateofMax, p.PRICE as maxPrice
FROM products p
LEFT JOIN products p2
 ON p.NAME=p2.NAME AND p.PRICE<p2.PRICE
WHERE p2.PRICE IS NULL;

这样做是productsname上加入p.PRICE<p2.PRICE,在每个名称中形成每一对可能的价格,p。由于这是左连接,如果p2中的价格在p2.PRICE中没有更高的价格,则NAME将设置为NULL。

因此,此查询选择没有更高价格的行,即行 最高价格(每组,<)。

要选择每组的最低价格(以及相应的日期),您可以将>更改为LEFT JOIN中的product,这样我们就可以选择我们可以使用的行在表中找到该名称的任何较小的价格。

由于您希望选择两者 max min,因此需要将这两个表连接在一起。

解决方案

这意味着product自身的3个自连接,其中两个p,p2表用于计算最大价格/日期,另外两个用于计算最小值。 / p>

在下面的查询中,除了最后一行之外的所有行都会生成一个最大价格&amp;它的日期,以及最低价格和它的日期。最后一次执行你的“最高价格发生在最低价格之后”。

p3,p4表用于计算最高价格,p3用于计算最低价格。如果p仅与ON p.NAME=p3.NAME p3.price<=p.price相关联,它仍然有效,但额外条件-- select max price & date of max & min price & date of min: SELECT p.NAME, p.ENTRY_DATE as dateofMax, p.PRICE as maxPrice, p3.ENTRY_DATE as dateofMin, p3.PRICE as minPrice, p.PRICE-p3.PRICE as PriceDiff FROM products p LEFT JOIN products p2 ON p.NAME=p2.NAME AND p.PRICE<p2.PRICE LEFT JOIN products p3 ON p.NAME=p3.NAME AND p3.price<=p.price LEFT JOIN products p4 ON p.NAME=p4.NAME AND p3.price>p4.price WHERE p2.PRICE IS NULL AND p4.PRICE IS NULL AND p.ENTRY_DATE>p3.ENTRY_DATE; -- make sure dateOfMax>dateofMin 会删除我们不感兴趣的行(没有必要寻找价格大于最大值的行的最低价格。)。

+--------+---------------------+----------+---------------------+----------+-----------+
| NAME   | dateofMax           | maxPrice | dateofMin           | minPrice | PriceDiff |
+--------+---------------------+----------+---------------------+----------+-----------+
| MONKEY | 2012-01-23 16:09:35 |    99.33 | 2012-01-23 09:31:19 |    93.05 | 6.28      |
+--------+---------------------+----------+---------------------+----------+-----------+

产生

{{1}}