Mysql 如何使用窗口函数获取每天计数项的差值或增量?

Mysql 如何使用窗口函数获取每天计数项的差值或增量?,mysql,sql,Mysql,Sql,我有一个表,其中有几个字段,如id、国家、ip、创建位置。然后我试图得到一天的总输入量和第二天的总输入量之间的差值 CREATE TABLE session ( id int NOT NULL AUTO_INCREMENT, country varchar(50) NOT NULL, ip varchar(255), created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (

我有一个表,其中有几个字段,如id、国家、ip、创建位置。然后我试图得到一天的总输入量和第二天的总输入量之间的差值

CREATE TABLE session (
    id int NOT NULL AUTO_INCREMENT,
    country varchar(50) NOT NULL,
    ip varchar(255),
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id)
);

INSERT INTO `session` (`id`, `country`, `ip`, `created_at`) VALUES
  ('1', 'IN', '10.100.102.11', '2021-04-05 20:26:02'),
   ('2', 'IN', '10.100.102.11', '2021-04-05 19:26:02'),
  ('3', 'US', '10.120.102.11', '2021-04-17 10:26:02'),
  ('4', 'US', '10.100.112.11', '2021-04-16 12:26:02'),
  ('5', 'AU', '10.100.102.122', '2021-04-12 19:36:02'),
  ('6', 'AU', '10.100.102.122', '2021-04-12 18:20:02'),
  ('7', 'AU', '10.100.102.122', '2021-04-12 23:26:02'),
  ('8', 'US', '10.100.102.2', '2021-04-16 21:33:01'),
  ('9', 'AU', '10.100.102.122', '2021-04-18 20:46:02'),
  ('10', 'AU', '10.100.102.111', '2021-04-04 13:19:12'),
  ('11', 'US', '10.100.112.11', '2021-04-16 12:26:02'),
  ('12', 'IN', '10.100.102.11', '2021-04-05 15:26:02'),
   ('13', 'IN', '10.100.102.11', '2021-04-05 19:26:02');
现在我编写了这个查询来获取增量

SELECT T1.date1 as date, IFNULL(T1.cnt1-T2.cnt2, T1.cnt1) as delta from (
  select TA.dateA as date1, MAX(TA.countA) as cnt1 from (
    select DATE(created_at) AS dateA, COUNT(*) AS countA
    FROM   session
    GROUP BY DATE(created_at)
 UNION 
   select DISTINCT DATE(DATE(created_at)+1) AS dateA, 0 AS countA
   FROM session
 ) as TA
  group by TA.dateA
 ) as T1
LEFT OUTER JOIN (
  select DATE(DATE(created_at)+1) AS date2,
        COUNT(*) AS cnt2
 FROM   session
 GROUP BY DATE(created_at)
) as T2
 ON T1.date1=T2.date2
 ORDER BY date;
然后我得到的结果如下

date    delta
2021-04-04  1
2021-04-05  3
2021-04-06  -4
2021-04-12  3
2021-04-13  -3
2021-04-16  3
2021-04-17  -2
2021-04-18  0
2021-04-19  -1
现在,是否有任何地方可以通过使用/或窗口功能对其进行改进/优化?(我对SQL一窍不通,仍在玩弄)。

试试较短的版本

with grp as (
    SELECT t.dateA, SUM(t.cnt) AS countA
    FROM  session,
    LATERAL (
       select DATE(created_at) AS dateA, 1 as cnt
       union all
       select DATE(DATE(created_at)+1), 0 as cnt
       ) t
    GROUP BY dateA
)
select t1.dateA as date, IFNULL(t1.countA-t2.countA, t1.countA) as delta 
from grp t1
left join grp t2 on DATE(t2.dateA + 1) = t1.dateA
order by t1.dateA

非常感谢您抽出时间。我刚开始使用SQL,所以可能无法在我自己的ATM上调试很多东西,但我在运行这个时遇到了这个错误DDL和DML语句;只允许SELECT语句。将DDL和DML放入模式面板。。“一把小提琴@subhandukundu,”小提琴补充道,“非常感谢你。”❤️