首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减去。SQL日值(今天值-昨天值)

减去。SQL日值(今天值-昨天值)
EN

Stack Overflow用户
提问于 2014-06-02 09:20:50
回答 1查看 1.1K关注 0票数 2

朋友们,我有一个数据库,在那里我保持所有用户的流量。每天都在更新。我想每天数一次车流量。意思是:今天的交通-昨天的交通?

有三张桌子(向下,向上,远程)。结果如下:

代码语言:javascript
复制
select rem.remoteid, down.mazgas, down.portas, down.down, up.up, down.date
from dbo.remoteid as rem
inner join dbo.down as down on down.mazgas=rem.mazgas and down.portas = rem.portas
inner join dbo.up as up on up.mazgas=down.mazgas  and up.portas = down.portas    
where down.mazgas=up.mazgas and down.portas=up.portas and down.date= up.date

result

remoteid         mazgas             portas           down    up       date
10156529    10.199.100.27   gpon-onu_1/12/5:1   2678.0  69963.9 2014-06-01
10156529    10.199.100.27   gpon-onu_1/12/5:1   2643.8  68912.3 2014-05-31
29546232    10.203.100.1    gpon-onu_1/16/1:4   927.8   39273.6 2014-06-01
29546232    10.203.100.1    gpon-onu_1/16/1:4   923.1   39126.7 2014-05-31

我想得到一个答案:

代码语言:javascript
复制
remoteid, mazgas, portas, down, up  where down = (down(today) - down(yesterday)) and up= (up(today) - up(yesterday))

非常感谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-02 10:02:58

由于您没有指定正在使用的RDBMS,所以我将尝试使用basic。像这样的东西会给你想要的结果:

代码语言:javascript
复制
SELECT
  r.remoteid,
  r.mazgas,
  r.portas,
  COALESCE(d2.down,0)-COALESCE(d1.down,0) AS down,
  COALESCE(u2.up  ,0)-COALESCE(u1.up  ,0) AS up,
  d2.date
FROM      dbo.remoteid AS r
JOIN      dbo.down     AS d2 ON d2.mazgas=r.mazgas AND d2.portas=r.portas
LEFT JOIN dbo.up       AS u2 ON u2.mazgas=r.mazgas AND u2.portas=r.portas AND u2.date=d2.date
LEFT JOIN dbo.down     AS d1 ON d1.mazgas=r.mazgas AND d1.portas=r.portas AND d1.date=(
   SELECT MAX(date)
   FROM dbo.down
   WHERE mazgas=r.mazgas AND portas=r.portas AND date<d2.date)
LEFT JOIN dbo.up       AS u1 ON u1.mazgas=r.mazgas AND u1.portas=r.portas AND u1.date=(
   SELECT MAX(date)
   FROM dbo.up
   WHERE mazgas=r.mazgas AND portas=r.portas AND date<u2.date)

需要考虑的事项:

  1. 并非所有RDBMS都支持合并。但是应该用(IFNULL或IF或IIF)代替它。作为最后的手段,你可以在大多数人支持的情况下退却。但合并或同等关系是很重要的。,您必须考虑加入中的NULL。你加入下载,上传两个不同的日期.无视诺尔斯就是自找麻烦。
  2. 我选择引用mazgas和portas的远程表。这似乎比使用does表更可靠,因为我认为remoteid主记录应该始终存在,并且不依赖日期。

--这不会给出与昨天值的差异,而是与值为(相同mazgas和portas)的最后一个日期的差异。如果所有的日子都有值,那么结果是一样的。

您想要的东西可以用一些日期代数来完成,比如这个简单的-1语法:

代码语言:javascript
复制
SELECT
  r.remoteid,
  r.mazgas,
  r.portas,
  COALESCE(d2.down,0)-COALESCE(d1.down,0) AS down,
  COALESCE(u2.up  ,0)-COALESCE(u1.up  ,0) AS up,
  d2.date
FROM      dbo.remoteid AS r
JOIN      dbo.down     AS d2 ON d2.mazgas=r.mazgas AND d2.portas=r.portas
LEFT JOIN dbo.up       AS u2 ON u2.mazgas=r.mazgas AND u2.portas=r.portas AND u2.date=d2.date
LEFT JOIN dbo.down     AS d1 ON d1.mazgas=r.mazgas AND d1.portas=r.portas AND d1.date=d2.date-1
LEFT JOIN dbo.up       AS u1 ON u1.mazgas=r.mazgas AND u1.portas=r.portas AND u1.date=u2.date-1

..。但是不同的RDBMS可能以其他方式处理日期代数(它们都有一些添加、减去天数的功能)。

就效率而言。--好吧--最好有关于mazgas、portas、date和up表的索引;)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23991148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档