使用MySQL查询比较行

3
我有一个MySQL数据库,其中包含一个表格,包含以下列:(Day_T1,Day_T2,Day_T3,Day_T4)和每行的唯一ID。它们都是整数。我想按顺序将每行与前面的行进行比较。我需要的比较标准是计算与前一行相比值为+1的值的数量。
因此,如果我们比较16和15,由于它上升了+1,应将其计为1。我需要每行比较的总计数。
行可能具有重复值。例如,如果您在下表中取前两行(19,18,15,16)和(20,17,15,15),则第二行有两个15。因此,每个应该被计算一次。这里的计数应为2。
样例表格如下:
ID  Day_T1  Day_T2  Day_T3  Day_T4

70  19      18      15      16
69  20      17      15      15
68  24      25      16      17
67  19      18      14      12
66  19      17      14      13
65  17      16      15      14

预期结果将类似于这样:
ID  69  68  67  66  65  64  etc

70  2   0   1   2   3   etc             
69      1   2   2   2   etc             
68          0   0   2   etc   

我只有基本的mysql查询知识,不确定mysql是否是正确的方法。如果不是,我会很高兴您能指导我正确的方向。

提前感谢。

根据Cobra_Fast的答案,解决方案如下:

SELECT
    d1.id,
    d2.id,
    IF((d1.day1-d2.day1)=1,1,0) +
    IF((d1.day1-d2.day2)=1,1,0) +
    IF((d1.day1-d2.day3)=1,1,0) +
    IF((d1.day1-d2.day4)=1,1,0) +
    IF((d1.day2-d2.day2)=1,1,0) +
    IF((d1.day2-d2.day1)=1,1,0) +
    IF((d1.day2-d2.day3)=1,1,0) +
    IF((d1.day2-d2.day4)=1,1,0) +
    IF((d1.day3-d2.day3)=1,1,0) +
    IF((d1.day3-d2.day1)=1,1,0) +
    IF((d1.day3-d2.day2)=1,1,0) +
    IF((d1.day3-d2.day4)=1,1,0) +
    IF((d1.day4-d2.day4)=1,1,0) +
    IF((d1.day4-d2.day1)=1,1,0) +
    IF((d1.day4-d2.day2)=1,1,0) +
    IF((d1.day4-d2.day3)=1,1,0)     AS onecount
FROM days AS d1 , days AS d2
WHERE d1.id IS NOT NULL AND d2.id IS NOT NULL AND d1.id<>d2.id;

表结构如下:

CREATE TABLE days (
    id INT AUTO_INCREMENT,
    day1 INT,
    day2 INT,
    day3 INT,
    day4 INT,
    PRIMARY KEY (id)
);

INSERT INTO days VALUES
    (70, 19, 18, 15, 16),
    (69, 20, 17, 15, 15),
    (68, 24, 25, 16, 17),
    (67, 19, 18, 14, 12),   
    (66, 19, 17, 14, 13),    
    (65, 17, 16, 15, 14);

65到70计数2? - Sal
抱歉,是我犯了错误。我已经纠正了。 - user223549
1个回答

1
你可以这样做:

SELECT
    d1.id,
    d2.id,
    IF(ABS(d1.day1-d2.day1)=1,1,0) +
    IF(ABS(d1.day2-d2.day2)=1,1,0) +
    IF(ABS(d1.day3-d2.day3)=1,1,0) +
    IF(ABS(d1.day4-d2.day4)=1,1,0) AS onecount
FROM days AS d1
LEFT JOIN days AS d2 ON (d1.id = (d2.id + 1))
WHERE d1.id IS NOT NULL AND d2.id IS NOT NULL;

结果看起来像这样:

id  id  onecount
66  65  3
67  66  2
68  67  0
...

在线编辑器: https://www.db-fiddle.com/f/7VAG1GTgj6CXiLKkPAHJtf/1


谢谢您的回答。如何使其适用于之前每一行?例如,对于ID=70的行,它应该按顺序与69、68、67等进行比较。您的解决方案只与前一行进行比较。 - user223549
要将所有内容进行比较,只需删除 LEFT JOIN 行并将 , days AS d2 添加到 FROM 行中,使其变为 FROM days AS d1, days AS d2 - Cobra_Fast
我检查了结果。我认为它双向计数+1。所以从id 69到id 70,应该是2。在结果中是3。其他似乎都一样。 - user223549
那么使用 ABS() 可能不正确。我相信你可以从这里弄清楚。 - Cobra_Fast
是的,我已经移除了ABS()函数,但不幸的是,结果仍然不正确。 - user223549

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接