【问题标题】:SQL Difference between using two datesSQL 使用两个日期的区别
【发布时间】:2013-02-05 04:14:37
【问题描述】:

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

执行和填充数量。
这两个字段的三个记录如下。

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

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

(SUBSTR (execid, 3, 10)

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

P.S 我需要选择同一日期的最大填充量。那是 1000 不是 800。

【问题讨论】:

  • 你怎么知道是 400 (1000-600) 而不是 200 (800-600)?前两个日期相同。还有其他订单吗?
  • 是的。抱歉我不能提。我需要从同一日期获得填充数量的最大值。
  • @ganuke,我想你还在苦苦挣扎。看起来你无法清楚地定义你的问题和你想要完成的事情。如果你清楚地描述了哪些数据是可用的,以及确切你想要实现什么,也许人们可以真正帮助你而不是在黑暗中拍摄猜测你想要什么.
  • @ganuke,也许您正在寻找:(1)获取每个唯一日期的最大填充数量,(2)计算最后一个日期和第二个最后日期之间的差异?
  • @Stephen.actually 它是第二个。计算最后日期和第二个最后日期之间的差异

标签: sql oracle


【解决方案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;

【讨论】:

  • 它不能正常工作。我从查询中删除了减号部分。然后它显示 1000(当 rownum=1 时)。但是当rownum = 2时它什么也没有显示。问题出在哪里。当我在第一个括号内运行查询时,它显示 1000 和 600 以及相关日期。
  • 嗯,你是对的。使用第二个查询并只取第一行,应该可以。
  • 它工作正常。但我只需要一张唱片。这是最近两天之间的差异。你的一个显示三个记录。你能告诉我如何只获得第一条记录吗?提前致谢
  • 窗口函数仅由 Oracle 支持,因此最好尽可能坚持使用标准 SQL(尽管 WITH 子句也是 Oracle)——更容易转移到另一个数据库引擎。
  • @Stephen Chung 我认为这是相当倒退的方法。如果您为数据库支付 $$$,并且它具有一些可以产生最有效解决方案的功能,请使用它!此外,WITH 和 windows 函数都是标准 SQL(只是不是古代版本),许多其他数据库(MS-SQL、PostgreSQL)都支持它们。
【解决方案2】:
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),其中包含每个唯一日期的最大填充数量,然后将此子查询交叉连接到自身,不包括相同的行。这会生成一个包含日期对(不包括相同日期)的表格。

按日期降序对这些对进行排序,最上面一行包含最后一个日期和倒数第二个日期,并带有适当的数量。

【讨论】:

    猜你喜欢
    • 2020-11-18
    • 1970-01-01
    • 2015-10-02
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2016-12-01
    相关资源
    最近更新 更多