【问题标题】:How to compare values for last and second last entry in table?如何比较表中最后一个和倒数第二个条目的值?
【发布时间】:2010-01-15 14:05:41
【问题描述】:

我在 Oracle 中有一个名为引号的表,其中包含两列:datevalue

我想比较表格中最后一个条目和倒数第二个条目的值。

在本例中,我想在一行中获取 13.1 和 11.1 的日期以及每个日期的值之间的差异 (10-5=5)。


行情表:

日期 - 值

13.1.2010 - 10

11.1.2010 - 5

10.1.2010 - 2

8.10.2010 - 1


编辑:

我想要一个更复杂的表,多一列companyId。我需要为每个公司获取物品。表看起来像这样:

行情表:

日期 - 价值 - 公司 ID

13.1.2010 - 10 - 10

11.1.2010 - 5 - 10

10.1.2010 - 2 - 10

8.10.2010 - 1 - 10

12.1.2010 - 7 - 20

10.1.2010 - 3 - 20

9.1.2010 - 2 - 20

8.10.2010 - 2 - 20

在这种情况下,我想得到两行(但通常只得到与公司数量一样多的行) - 每家公司都会返回日期和最新日期之间的差异值和第二个最新值。 所以在这种情况下它会返回:

companyId 10 13.1 and 11.1 and 5 和另一行是这样的:

companyId 20 12.1 和 10.1 和 4 (7-3=4)。

【问题讨论】:

    标签: sql oracle syntax


    【解决方案1】:
    SELECT  *, value - nextvalue AS diff
    FROM    (
            SELECT  m.*, LEAD(value) OVER (ORDER BY date DESC) AS nextvalue
            FROM    mytable m
            ORDER BY
                    date DESC
            )
    WHERE   rownum = 1
    

    更新:

    按公司选择结果:

    SELECT  value - nextvalue AS diff
    FROM    (
            SELECT  m.*,
                    LEAD(value) OVER (PARTITION BY companyId ORDER BY date DESC) AS nextvalue,
                    ROW_NUMBER() OVER (PARTITION BY companyId ORDER BY date DESC) AS rn
            FROM    mytable m
            )
    WHERE   rn = 1
    

    【讨论】:

    • 我已经用更复杂的表格更新了这个问题。你知道怎么解决吗?
    猜你喜欢
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多