Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何得到两行之间的差异_Sql_Postgresql_Function_Select_Time - Fatal编程技术网

Sql 如何得到两行之间的差异

Sql 如何得到两行之间的差异,sql,postgresql,function,select,time,Sql,Postgresql,Function,Select,Time,谢谢你的帮助 我在PostgreSQL中有下表 这些列是 ON = END - START IDLE = START (LINE 2) - END (LINE 1) 我需要计算“空闲”使用选择。。。通过从第1行的末尾减去第2行的起点来获得怠速值,如下示例,怠速值00:25为09:25-09:00 我无法为此创建逻辑,也无法创建用于计算它的代码 这是我的选择 select st.id, st.tvd_unidade, st.tvd_pdv,

谢谢你的帮助 我在PostgreSQL中有下表

这些列是

ON = END - START
IDLE = START (LINE 2) - END (LINE 1)
我需要计算“空闲”使用选择。。。通过从第1行的末尾减去第2行的起点来获得怠速值,如下示例,怠速值00:25为09:25-09:00

我无法为此创建逻辑,也无法创建用于计算它的代码

这是我的选择

    select st.id,
       st.tvd_unidade,
       st.tvd_pdv, 
       st.tvd_cupom,
       st.tvd_operador,
       min(st.tvd_data_hora) as start_at,
       max(en.tvd_data_hora) as end_at,
       max(en.tvd_data_hora) - min(st.tvd_data_hora) as produtivo
  from ger st 
 inner join ger en on st.tvd_unidade = en.tvd_unidade and st.tvd_pdv = en.tvd_pdv and st.tvd_cupom = en.tvd_cupom 
 where en.tvd_tipo_reg in ('FINN','FINn')
  and st.tvd_tipo_reg in ('INFN','INFn')
 group by 1

在你担心数学之前,你需要能够在一行上看到你需要的所有数据。要查看其他行中的数据,请使用窗口功能。在这种情况下,您可以使用lag窗口功能查看前一行—类似这样的内容

Select start, end, lag(end) over (order by [your sort key]) as lastEnd
from table
order by [your sort key]

应该给你你需要的数据。一旦确定获得了正确的数据,就可以开始对on和idle进行数学计算了

到目前为止您尝试了什么?我尝试过使用:Rownum,但我的表操作了超过100.000个值,尝试在查询结束时使用“with”select但不使用workUse
Limit 10
,因此每次只处理几行。这将使测试和游戏变得更快。或者,将一些示例数据复制到一个新表中,以便在中处理您的查询。与其说您尝试了什么,不如在问题中发布查询以及实际结果,而不仅仅是说它不起作用。“不工作”可能意味着从语法错误到查询挂起、无结果到错误结果。使用行号和CTE(带查询)听起来像是正确的方法,作为答案给出的滞后解决方案也是正确的。我的表有超过100.000行,一行一行显示开始和结束时间。。。明天我测试滞后并返回这里。我不理解函数滞后作为帮助我。。。我将查询更改为使用LAG,但结果相同,没有“LAG”LAG用于查看前一行的值。如果您在第10行,Lag(end,1)表示从第(10-1)行中选择end列的值。我只在上面使用了lag(end),因为其中一个是默认值。但是,您需要给它一个排序顺序(这是“结束(排序依据?”)部分)。对于您的使用,排序顺序需要与主查询的顺序相同。有关更多信息和教程,请搜索postgres lag函数。