为每个组获取前x天的收入

7z5jn7bk  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(400)

这是我的table

  1. CREATE TABLE financials (
  2. id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  3. CountryID VARCHAR(30) NOT NULL,
  4. ProductID VARCHAR(30) NOT NULL,
  5. Revenue INT NOT NULL,
  6. cost INT NOT NULL,
  7. reg_date TIMESTAMP
  8. );
  9. INSERT INTO `financials` (`id`, `CountryID`, `ProductID`, `Revenue`, `cost`, `reg_date`) VALUES
  10. ( 1, 'Canada', 'Doe' , 20, 5, '2010-01-31 12:01:01'),
  11. ( 2, 'USA' , 'Tyson' , 40, 15, '2010-02-14 12:01:01'),
  12. ( 3, 'France', 'Keaton', 80, 25, '2010-03-25 12:01:01'),
  13. ( 4, 'France', 'Keaton',180, 45, '2010-04-24 12:01:01'),
  14. ( 5, 'France', 'Keaton', 30, 6, '2010-04-25 12:01:01'),
  15. ( 6, 'France', 'Emma' , 15, 2, '2010-01-24 12:01:01'),
  16. ( 7, 'France', 'Emma' , 60, 36, '2010-01-25 12:01:01'),
  17. ( 8, 'France', 'Lammy' ,130, 26, '2010-04-25 12:01:01'),
  18. ( 9, 'France', 'Louis' ,350, 12, '2010-04-25 12:01:01'),
  19. (10, 'France', 'Dennis',100,200, '2010-04-25 12:01:01'),
  20. (11, 'USA' , 'Zooey' , 70, 16, '2010-04-25 12:01:01'),
  21. (12, 'France', 'Alex' , 2, 16, '2010-04-25 12:01:01');

对于每个产品和日期组合,我需要得到前5天的收入。例如,对于产品“keaton”,最后一次购买是在2010年4月25日,它只将2010年4月20日至2010年4月25日之间的收入相加,因此将为210。而对于“emma”,它将返回75,因为它将对2010-01-20到2010-01-25之间的所有内容求和。

  1. SELECT ProductID, sum(revenue), reg_date
  2. FROM financials f
  3. Where reg_date in (
  4. SELECT reg_date
  5. FROM financials as t2
  6. WHERE t2.ProductID = f.productID
  7. ORDER BY reg_date
  8. LIMIT 5)

不幸的是,当我使用https://sqltest.net/ 或者http://sqlfiddle.com/ 它表示不支持“limit&in/all/any/some子查询”。我的查询是否有效?

edqdpe6u

edqdpe6u1#

经过一些试验,我最终得到了一些复杂的查询,我认为它解决了您的问题

  1. SELECT
  2. financials.ProductID, sum(financials.Revenue) as Revenues
  3. FROM
  4. financials
  5. INNER JOIN (
  6. SELECT ProductId, GROUP_CONCAT(id ORDER BY reg_date DESC) groupedIds
  7. FROM financials
  8. group by ProductId
  9. ) group_max
  10. ON financials.ProductId = group_max.ProductId
  11. AND FIND_IN_SET(financials.id, groupedIds) BETWEEN 1 AND 5
  12. group by financials.ProductID

首先我用 group by financials.ProductID 按产品计算收入。您面临的真正问题是为每个组消除所有不在前5位的行。为此,我使用了这个问题的解决方案,将\u concat分组,并在\u集合中找到\u,从而无限制地得到前5个结果。而不是 WHERE IN 我曾经 JOIN 但有了这个, WHERE IN 可能也有用。
小提琴在这儿

展开查看全部
0s7z1bwu

0s7z1bwu2#

您的查询是正确的,但在mysql中可能不起作用。mysql在使用 in 以及 limit 使用子查询。
取而代之的是:

  1. SELECT f.ProductID, SUM(f.revenue)
  2. FROM financials f JOIN
  3. (SELECT ProductId, MAX(reg_date) as max_reg_date
  4. FROM financials
  5. GROUP BY ProductId
  6. ) ff
  7. ON f.ProductId = ff.ProductId and
  8. f.reg_date >= ff.max_reg_date - interval 5 day
  9. GROUP BY f.ProductId;

编辑:
如果要为每个产品和日期组合使用此查询,则可以使用自联接或关联子查询:

  1. SELECT f.*,
  2. (SELECT SUM(f2.revenue)
  3. FROM financials f2
  4. WHERE f2.ProductId = f.ProductId AND
  5. f2.reg_date <= f.reg_date AND
  6. f2.reg_date >= f.reg_date - interval 5 day
  7. ) as sum_five_preceding_days
  8. FROM financials f;
展开查看全部

相关问题