创建一个连接ID上的多个表的视图和需要舍入的时间戳

时间:2017-12-06 15:41:34

标签: sql database sqlite

我有一个Web应用程序,根据信息将数据发送到我的sqlite数据库到不同的表中。我想根据cownumber和TS [timestamp]制作一个将多个表合并在一起的视图(我的表没有更新,因此对同一个cownumber的更改会将完整记录作为带有新时间戳的新条目发送)。 ajax调用是逐表进行的,因此TS不会完全同步,通常它们可以在5-20秒内关闭,具体取决于连接

以下是三个表格的示例

+----master_animal-----+
+----------------------------------------------------+
| cownumber | height   | weight | ts                 |
+-----------+----------+--------+--------------------+
| 1         | 150      | ...    | 2017-12-01 12:28:00|
| 2         | 170      | ...    | 2017-12-03 17:16:00|
| 3         | 60       | ...    | 2017-12-03 08:09:00|
| 4         | 109      | ...    | 2017-12-04 23:23:00|


+----animal_inventory-----+
+-------------------------------------------------------------+
| cownumber | brandlocation| dateacquired| ts                 |
+-----------+--------------+-------------+--------------------+
| 1         | ...          | ...         | 2017-12-01 12:28:50|
| 2         | ...          | ...         | 2017-12-03 17:16:30|
| 3         | ...          | ...         | 2017-12-03 08:09:12|
| 4         |  ...         | ...         | 2017-12-04 23:23:23|

+----experiment-----+
+-------------------------------------------------------------+
| cownumber | ageatwean    | birthweight | ts                 |
+-----------+--------------+-------------+--------------------+
| 1         | ...          | ...         | 2017-12-01 12:28:20|
| 2         | ...          | ...         | 2017-12-03 17:16:41|
| 3         | ...          | ...         | 2017-12-03 08:09:24|
| 4         |  ...         | ...         | 2017-12-04 23:23:11|

我写的视图

CREATE VIEW testing
AS SELECT a.height,a.weight,a.cownumber,
b.brandlocation,b.dateacquired,
c.ageatwean,c.birthweight
FROM master_animal a, animal_inventory b, experiment c
WHERE a.cownumber=b.cownumber
AND ROUND(a.ts/10000) = ROUND(b.ts/10000)
AND a.cownumber=c.cownumber
AND ROUND(a.ts/10000) = ROUND(c.ts/10000);

我写的查询

Select * from testing where cownumber = 1;

我希望得到的是

+----testing-----+
+----------------------------------------------------+
| cownumber | height | weight | brandlocation| dateacquired | ageatwean |birthweight | 
+-----------+--------+--------+--------------+--------------+-----------+------------+
| 941        | 0     | ...    |       ...    |     ...      |     ...   |   ..       |

只要所有相关记录在彼此的几秒内,cownumber 941就会有一行。我不确定我是否需要除以10000或更小。相同的记录应该相隔不超过50秒。任何超过50秒的东西都应被视为新记录。

当我测试这个cownumber只有一个记录时,它可以正常工作。但是我可以说我从每个表中更改了一些信息。我提供了一个新的高度,一个新的品牌定位。

而不是获得两行。第一行是初始数据条目,第二行显示具有更改值的相同cownumber,我返回8行并进行部分更改。

height|weight|cownumber|brandlocation|dateacquired|ageatwean|birthweight|
0.0|0.0|941|0|0|0.0|0
0.0|0.0|941|0|0|0.0|0
0.0|0.0|941|Left Hip|0|0.0|0
0.0|0.0|941|Left Hip|0|0.0|0
50.0|0.0|941|0|0|0.0|0
50.0|0.0|941|0|0|0.0|0
50.0|0.0|941|Left Hip|0|0.0|0
50.0|0.0|941|Left Hip|0|0.0|0

我认为问题出在我的where子句中,但我不确定如何解决它

1 个答案:

答案 0 :(得分:0)

时间戳存储为字符串。当您尝试划分它时,数据库会尝试将其转换为数字,从而生成2017。所以所有时间戳最终都是一样的。

划分无法确定距离;尽管它们彼此接近,但值9999和10000将最终不同。 (并且整数除法会产生整数结果,因此ROUND()无效。)

要计算距离,请先将时间戳转换为秒数,然后使用abs()

SELECT ...
FROM master_animal m
JOIN animal_inventory i ON m.cownumber = i.cownumber
                       AND abs(strftime('%s', m.ts) - strftime('%s', i.ts)) <= 50
JOIN experiment e       ON m.cownumber = e.cownumber
                       AND abs(strftime('%s', m.ts) - strftime('%s', e.ts)) <= 50;