SQL使用两个日期之间的区别

时间:2011-03-12 06:15:38

标签: sql oracle

我的数据库有一个名为'clientordermas'的表。该表的两列如下。

execid和filledqty 这两个字段的三个记录如下。

  

E02011 / 03 / 12-05:57_24384:1000
  E02011 / 03 / 12-05:57_24384:800
  E02011 / 03 / 09-05:57_24384:600

我需要做的是获取最新日期之间的fillqty差异和最新日期之前的1,即400(1000-400)。
我从execid中提取了日期,如下所示:

  

(SUBSTR(execid,3,10)

我努力但是我无法编写sql查询来获得400.有人可以帮我这样做吗???

P.S我需要从同一天选择最大填充数量。那是1000而不是800。

2 个答案:

答案 0 :(得分:1)

您可以使用窗口函数来访问“附近”行,因此如果您首先清理子查询中的数据然后使用窗口函数来访问下一行,您应该得到正确的结果。但除非你有一个substr(execid, 3, 10)的索引,否则这将是缓慢的。

WITH datevalues AS
(
  SELECT max(filledqty) maxfilledqty, substr(execid, 3, 10) execiddate
  FROM clientordermas
  GROUP BY substr(execid, 3, 10)
)
SELECT
  execiddate,
  maxfilledqty -
  last_value(maxfilledqty) over(ORDER BY execiddate DESC ROWS BETWEEN 0 PRECEDING AND 1 FOLLOWING)
FROM datevalues
ORDER BY execiddate DESC;

答案 1 :(得分:0)

WITH maxqtys AS (
SELECT substr(a.execid,3,10) AS date, MAX(a.filledqty) AS maxqty
FROM clientordermas a
GROUP BY substr(a.execid,3,10)
)
SELECT a.maxqty-b.maxqty
FROM maxqtys a, maxqtys b
WHERE a.date <> b.date AND ROWNUM=1
ORDER BY a.date DESC, b.date DESC

首先创建一个子查询(maxqty),其中包含每个唯一日期的max filledqty,然后将此子查询交叉连接到自身,不包括相同的行。这会产生一个包含日期对(不包括相同日期)的表格。

按日期降序对这些对进行排序,然后在顶行中包含最后一个和倒数第二个日期,并包含适当的数量。