我有一个如下所示的表格,我正在尝试获取特定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
感谢您的帮助!
答案 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;
这样做是products
在name
上加入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}}