sql - 属于同一组但存储在两行中的值的差异
问题描述
我有一个问题,我需要获取 2 个具有 2 个不同值的特定记录并找到它们之间的差异。这需要为每个设备完成。让我们以下表为例
DevID reason amount DateTime
--------------------------------------------------
99 5 84 18-12-2016 18:10
99 0 35 18-12-2016 18:11
99 0 80 18-12-2016 18:12
99 0 34 18-12-2016 18:15
23 5 36 18-12-2016 18:16
23 4 22 18-12-2016 18:17
23 1 22 18-12-2016 18:18
23 2 22 18-12-2016 18:19
99 2 11 18-12-2016 18:20
99 8 50 18-12-2016 18:21
99 0 23 18-12-2016 18:22
99 5 06 18-12-2016 18:25
99 8 12 18-12-2016 18:30
所以我感兴趣的原因是 5 和 8。5 是设备登录,8 是注销,其他数字指的是其他东西。我想使用设备登录原因(5)和下一个设备注销(8)获取记录,并找到其金额值的差异,因此在上表中设备 99,原因 5 的金额为 84 和注销事件(8)是 50,所以差异是 34,如果大于 10,我需要列出该设备。(请注意,同一记录还有 5 和 8 的另一种情况,差异不大于 5)但第一组的 diff 大于 10,因此我们需要显示该设备 id
所以上面的预期输出是
DevID
-------
99
我正在考虑加入所有记录为 5 的表 A(按 deviceid、日期排序)和表 B 的所有记录为 8,然后减去它们的数量并显示值大于 10 的记录。不确定是否加入是要走的路吗?任何更简单/快速的解决方案?
解决方案
您可以使用窗口函数获得下一个“8”值。然后join
过滤:
select t.*,
(t.value - t8.value) as diff
from (select t.*,
min(case when reason = 8 then datetime end) over (partition by devid order by datetime desc) as next_8_datetime
from t
) t left join
t t8
on t8.devid = t.devid and
t8.datetime = t.next_8_datetime and
t8.reason = 8
where t.reason = 5
order by diff desc
limit 1;
推荐阅读
- ios - 如何将 UIButton 与自定义类一起使用?
- python-3.x - Telepot中的线程保存串行连接(Python)
- android - 无法在 android 上编译 tensorflowlite C++ API
- angularjs - 如何使用 AngularJS 服务依赖项对 Angular 服务进行单元测试
- c++ - 如何在不使用 & 的情况下传递函数
- xpages - 消除来自 DOM 的标签
- s4sdk - 在构建项目时使用参数“LATEST”不适用于“mvn clean install”
- angular - 使用异步管道和 Observable 处理错误
- haskell - 如何与这种数据类型进行交互
- c - 使 gzprintf 忽略区域设置 LC_NUMERIC