具有NULL值的行的差异

时间:2017-09-01 10:42:27

标签: mysql

我有一堆行position列,可以是integerNULL

行是按日期顺序排列的,我要做的是获取position字段与前一天不同的行数。

我有以下内容:http://dbfiddle.uk/?rdbms=mariadb_10.2&fiddle=c67fed3a0b65f875fec1cf7d1992b69b

这很有用,但问题是,position可以是NULL,以下内容不起作用:http://dbfiddle.uk/?rdbms=mariadb_10.2&fiddle=f61b5407f178210bc50aadfd3427639c

有没有办法修改我的查询,所以它还会包含NULL行?

由于

2 个答案:

答案 0 :(得分:0)

如果您更改以下内容,您的第二个示例也会起作用:

  • 在“创建表”中,通过删除“not null”
  • 使位置列“可为空”
  • 插入时从“NULL”中删除引号
  • 更改总和如下

SUM(当IFNULL(r1。position,0)的情况!= IFNULL(r2。position,0)那么1 ELSE 0 END)

http://dbfiddle.uk/?rdbms=mariadb_10.2&fiddle=bd00e6ed47872d05f544842ade631f6a

答案 1 :(得分:0)

插入时将''从null中删除,如下所示

    INSERT INTO `rankings` (`id`, `position`, `date`, `ranking_id`) VALUES
  ('1', '22', '2015-05-14', '1'),
  ('2', '22', '2015-05-15', '1'),
  ('3', null , '2015-05-16',  '1'),
  ('4', '22', '2015-05-17',  '1');

尝试以下查询

SELECT r1.`date`, SUM(CASE WHEN r1.`position` != r2.`position` THEN 1 ELSE 0 END) as daily_changes
FROM `rankings` r1
LEFT JOIN `rankings` r2
  ON r1.`date` = r2.`date` + 1
 AND r1.`ranking_id` = r2.`ranking_id`
WHERE  r1.position IS NOT NULL OR r2.position IS NOT NULL
GROUP BY r1.`date`
order by r1.`date` DESC
limit 1