这是我的表
CREATE TABLE financials (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
CountryID VARCHAR(30) NOT NULL,
ProductID VARCHAR(30) NOT NULL,
Revenue INT NOT NULL,
cost INT NOT NULL,
reg_date TIMESTAMP
);
INSERT INTO `financials` (`id`, `CountryID`, `ProductID`, `Revenue`, `cost`, `reg_date`) VALUES
( 1, 'Canada', 'Doe' , 20, 5, '2010-01-31 12:01:01'),
( 2, 'USA' , 'Tyson' , 40, 15, '2010-02-14 12:01:01'),
( 3, 'France', 'Keaton', 80, 25, '2010-03-25 12:01:01'),
( 4, 'France', 'Keaton',180, 45, '2010-04-24 12:01:01'),
( 5, 'France', 'Keaton', 30, 6, '2010-04-25 12:01:01'),
( 6, 'France', 'Emma' , 15, 2, '2010-01-24 12:01:01'),
( 7, 'France', 'Emma' , 60, 36, '2010-01-25 12:01:01'),
( 8, 'France', 'Lammy' ,130, 26, '2010-04-25 12:01:01'),
( 9, 'France', 'Louis' ,350, 12, '2010-04-25 12:01:01'),
(10, 'France', 'Dennis',100,200, '2010-04-25 12:01:01'),
(11, 'USA' , 'Zooey' , 70, 16, '2010-04-25 12:01:01'),
(12, 'France', 'Alex' , 2, 16, '2010-04-25 12:01:01');
对于每个产品和日期组合,我需要获得前5天的收入。例如,对于产品'Keaton',最后一次购买是在2010-04-25,它只会在2010-04-20到2010-04-25之间总结收入,因此它将是210.而对于“Emma” ,它将返回75,因为它将在2010-01-20至2010-01-25之间汇总所有内容。
SELECT ProductID, sum(revenue), reg_date
FROM financials f
Where reg_date in (
SELECT reg_date
FROM financials as t2
WHERE t2.ProductID = f.productID
ORDER BY reg_date
LIMIT 5)
不幸的是,当我使用https://sqltest.net/或http://sqlfiddle.com/时,它会说'LIMIT&不支持IN / ALL / ANY / SOME子查询'。我的查询是否有效?
答案 0 :(得分:1)
您的查询是在正确的轨道上,但可能无法在MySQL中运行。 MySQL对in
和limit
子查询的使用有限制。
相反:
SELECT f.ProductID, SUM(f.revenue)
FROM financials f JOIN
(SELECT ProductId, MAX(reg_date) as max_reg_date
FROM financials
GROUP BY ProductId
) ff
ON f.ProductId = ff.ProductId and
f.reg_date >= ff.max_reg_date - interval 5 day
GROUP BY f.ProductId;
编辑:
如果您希望每个产品和日期组合使用此功能,则可以使用自联接或相关子查询:
SELECT f.*,
(SELECT SUM(f2.revenue)
FROM financials f2
WHERE f2.ProductId = f.ProductId AND
f2.reg_date <= f.reg_date AND
f2.reg_date >= f.reg_date - interval 5 day
) as sum_five_preceding_days
FROM financials f;
答案 1 :(得分:0)
经过一些试验,我最终得到了一些复杂的查询,我认为它解决了你的问题
SELECT
financials.ProductID, sum(financials.Revenue) as Revenues
FROM
financials
INNER JOIN (
SELECT ProductId, GROUP_CONCAT(id ORDER BY reg_date DESC) groupedIds
FROM financials
group by ProductId
) group_max
ON financials.ProductId = group_max.ProductId
AND FIND_IN_SET(financials.id, groupedIds) BETWEEN 1 AND 5
group by financials.ProductID
首先,我使用group by financials.ProductID
计算产品收入。您面临的真正问题是消除每个组中不在前5位的所有行。为此,我使用solution from this question,GROUP_CONCAT和FIND_IN_SET来获得前5个结果而没有LIMIT。我使用WHERE IN
而不是JOIN
,而WHERE IN
也可以使用{{1}}。
继承人FIDDLE