我有一个包含3列的表格:
FOR %%A IN (Team.txt) DO Find "%%A" *.csv > result.txt
该表用于跟踪工作流中的步骤,并且特定渣油可以存在多个具有不同类型ID(数字)和日期戳的特定渣油。 我想计算两次换档之间的时间 - 即,特定渣油上的1和17
我尝试过像这样的sql-plus语法 并尝试使用别名: 有什么建议吗?
resid type date
答案 0 :(得分:1)
SELECT a.resid, a."type" type1, a."date" date1, b."type" type17, b."date" date17, b."date" - a."date" AS date_diff
FROM tablename a JOIN tablename b ON a.resid = b.resid AND b."type" = '17'
WHERE a."type" = '1' AND a.resid = :resid
请不要使用oracle保留字作为列名。 当(渣油,类型)是唯一的时,您可以这样做:
SELECT :resid resid,
(select "date" FROM tablename WHERE resid = :resid AND "type" = '17') -
(select "date" FROM tablename WHERE resid = :resid AND "type" = '1') date_diff
FROM DUAL
答案 1 :(得分:1)
您的尝试查询在in
之前的列列表周围缺少括号 - 因此应该是where (resid, date in)
- 但也有and where
无效,可能还有其他问题。大多数情况下它并不能满足您的需求,尤其是因为两个date
值来自同一行(对于类型1),因此减去它们将始终为零。
您可以使用条件聚合:
select resid,
min(case when type_id = 17 then date_stamp end)
- min(case when type_id = 1 then date_stamp end) as diff
from tablename
where type_id in (1, 17) -- optional
and resid = :some_value
group by resid;
case
为每个匹配行提供null或日期戳;聚合然后从那些中给出一个值(有利于非空的)。
如果只存在其中一个类型ID,那么差异将为空。
如果可能有倍数,您可能希望将17的min()
更改为max()
- 取决于您真正需要的内容。
快速演示:
with tablename(resid, type_id, date_stamp) as (
select 1, 1, sysdate - 10 from dual
union all select 1, 17, sysdate - 7 from dual
union all select 2, 1, sysdate - 5 from dual
union all select 2, 17, sysdate - 3 from dual
union all select 3, 1, sysdate - 10 from dual
)
select resid,
min(case when type_id = 17 then date_stamp end)
- min(case when type_id = 1 then date_stamp end) as diff
from tablename
where type_id in (1, 17) -- optional
--and resid = 2
group by resid;
RESID DIFF
---------- ----------
1 3
2 2
3