Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql查找每个记录以前发生日期的计数_Mysql_Sql - Fatal编程技术网

Mysql查找每个记录以前发生日期的计数

Mysql查找每个记录以前发生日期的计数,mysql,sql,Mysql,Sql,我有一个表来存储id,sid和日期时间。 id用作主键,在数据中没有意义。 sid用于标识实体 例如 然后,我想查询每条记录,计算与当前日期的上一个日期相同且具有相同sid的表中的出现次数,如: id sid date previous_count ---------------------------------- 1 1 2020-01-12 2 2 2 2020-01-01 1 3 1 2019-12-31 1 4

我有一个表来存储id,sid和日期时间。 id用作主键,在数据中没有意义。 sid用于标识实体

例如

然后,我想查询每条记录,计算与当前日期的上一个日期相同且具有相同sid的表中的出现次数,如:

id  sid  date       previous_count
----------------------------------
1    1  2020-01-12      2
2    2  2020-01-01      1
3    1  2019-12-31      1
4    2  2019-12-31      1
5    1  2019-12-31      1
6    1  2019-11-01      0
7    3  2019-11-01      1
8    3  2018-12-21      0
9    2  2018-12-21      0
说明: 对于第1行,由于
sid 1
2019-12-31
中有两条记录,这是表中
sid 1
的前一个日期
2020-01-12
,因此它在
前一次_计数中有2条记录

而在第2行中,由于
sid2
2019-12-31
中只有一条记录,这是
sid2
的前一个日期
2020-01-01
,因此它在
前一次计数中只有一条记录。

谢谢

您正在寻找的
densite\u rank()-1

select t.*,
       (dense_rank() over (partition by sid order by date) - 1) as previous_count
from t
order by id;
在MySQL的旧版本中,可以使用变量或相关子查询:

select t.*,
       (select count(distinct t2.date)
        from t t2
        where t2.sid = t.sid and t2.date < t.date
       ) as previous_count
from t
order by id;

是一个dbfiddle。

我正在使用mysql 5.x,所以我正在尝试您的旧版本代码。但这似乎不是我想要的,因为我需要计算的日期只比行的日期小,不是所有的日期都比行的日期小date@kt_at_kt . . . 我发现您有重复的
sid
/
date
对。在这种情况下,您需要的是
densite\u rank()
而不是
row\u number()
。您编辑的ans非常接近我想要的结果,但似乎仍然不是我想要的。您可以在ans中看到第5行。我期望的结果应该是1,但您给出2
select t.*,
       (select count(distinct t2.date)
        from t t2
        where t2.sid = t.sid and t2.date < t.date
       ) as previous_count
from t
order by id;
select t.*, lag(cnt, 1, 0) over (partition by sid order by date)
from (select t.*,
             count(*) over (partition by sid, date) as cnt
      from t
     ) t
order by id;