首页 > 解决方案 > 如何在mysql中使用给定日期计算前一个日期

问题描述

我已经使用窗口函数成功计算了每列的排名。

我正在尝试从上一个日期中减去排名;记录如下

在此处输入图像描述

我正在尝试获得这样的输出

在此处输入图像描述

CREATE TABLE `test_a` (
  `date` date DEFAULT NULL,
  `id` int DEFAULT NULL,
  `x` decimal(39,4) DEFAULT NULL,
  `x_RANK` bigint unsigned NOT NULL DEFAULT '0',
  `y` decimal(39,4) DEFAULT NULL,
  `y_rank` bigint unsigned NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

/*表格数据test_a*/

insert  into `test_a`(`date`,`id`,`x`,`x_RANK`,`y`,`y_rank``) values 
('2020-03-30',107,0.6477,2,0.8087,1),
('2020-03-30',112,99,4,8.9137,4),
('2020-03-30',110,0.0983,1,3.3885,3),
('2020-03-30',102,2.4444,3,2.7200,2),
('2020-03-31',112,0.2292,2,8.8220,4),
('2020-03-31',107,0.7146,3,0.8755,1),
('2020-03-31',110,0.1680,1,3.7388,3),
('2020-03-31',102,2.7215,4,3.3320,2);

标签: mysql

解决方案


SELECT `date`,
       `id`,
       `x`,
       `x_RANK`,
       `x_RANK` - COALESCE(LAG(`x_RANK`) OVER (PARTITION BY `id` ORDER BY `date`), 0) diff_rank_x,
       `y`,
       `y_rank`,
       `y_RANK` - COALESCE(LAG(`y_RANK`) OVER (PARTITION BY `id` ORDER BY `date`), 0) diff_rank_y
FROM test_a
ORDER BY `id`, `date`;

小提琴

您可以添加一个条件,从输出中删除“第一”行id(例如,检查 noneLAG()不为空)。


推荐阅读