0

我试图仅根据另外 3 列中的唯一 ID 集来获取 1 行。在我的数据库中,对于其他 3 列中的一组唯一 ID,每个日期都有许多记录(例如,您可以想象产品编号)。库存状态仅按日期(更改)发布,而不是作为数量的一个最终编号。因此,获取实际库存状态的唯一方法是使用最新日期检查最新的库存状态更新 - 最顶行总是每个给定的产品 ID 组合。

这就是我的桌子现在的样子:

包含原始数据的表

Code1         Cde2         Code3           Date        Stock status
arti-cd-base  arti-cd-sfx  adfc-cd-diffco  stof-dt     stof-qty-op
------------  -----------  --------------  ----------  -----------
      1            15            0         2019-08-31       200
      1            15            0         2019-08-25       290
      2            16            2         2019-08-28       100
      2            16            2         2019-08-26        80
      2            16            2         2019-08-21       200
      3            18           25         2019-08-18        75

这就是我希望它看起来的样子 - 每个 arti-cd-base、arti-cd-sfx 和adfc-cd-diffco。

表应如下所示

Code1         Cde2         Code3           Date        Stock status
arti-cd-base  arti-cd-sfx  adfc-cd-diffco  stof-dt     stof-qty-op
------------  -----------  --------------  ----------  -----------
      1            15            0         2019-08-31       200
      2            16            2         2019-08-28       100
      3            18           25         2019-08-18        75

顶部的列 ID 连续如下:

      Code1         Code2          Code3          Date  -   Stock status
│ arti-cd-base │ arti-cd-sfx │ adfc-cd-diffco │   stof-dt   │ stof-qty-op │

是否有任何可能的方法通过 SQL 来实现这一点?我找到了一个仅通过命令显示一行的选项:“偏移 0 行仅获取前 1 行”,但是这仅显示 1 行,但不尊重其他三列中给出的一组产品 ID 中的一行( arti-cd-base、arti-cd-sfx 和 adfc-cd-diffco)。有人会看到任何方法吗?

4

2 回答 2

1

看看这个选项:

SELECT *
FROM (
    SELECT * 
    ,   ROW_NUMBER() OVER ( PARTITION BY arti_cd_base ORDER BY stof_dt DESC) AS rwn
    FROM yourTable
    ) x
WHERE x.rwn = 1 

或者在你的情况下:

    SELECT *
    FROM ( 
        SELECT stof_0."arti-cd-base"
        , stof_0."arti-cd-sfx"
        , stof_0."adfc-cd-diffco"
        , stof_0."dcmf-nr"
        , stof_0."stof-dt"
        , stof_0."stof-qty-op"
        , stof_0."stof-qty-nop"
        , stof_0."stof-qty-brok"
        , stof_0."stof-qty-brok-ok"
        , stof_0."stof-qty-ext"
        , stof_0."stof-qty-dock"
        , stof_0."stof-qty-trans"
        , stof_0."stof-qty-diff"
        , stof_0."stof-qty-fin-qty"
        , stof_0."stof-qty-fin-temp"
        , stof_0."stof-am" 
        , ROW_NUMBER() OVER (PARTITION BY stof_0."arti-cd-base" ORDER BY stof_0."stof-dt" DESC ) AS rwn
        FROM NILOS.PUB.stof stof_0 
        WHERE (stof_0."arti-cd-base"=1) 
        AND (stof_0."arti-cd-sfx"=15) 
        AND (stof_0."adfc-cd-diffco"=0) 
        ) x
    WHERE x.rwn = 1 

或者:

SELECT x.*
FROM (
        SELECT stof_0."arti-cd-base"
        , stof_0."arti-cd-sfx"
        , stof_0."adfc-cd-diffco"
        , stof_0."dcmf-nr"
        , stof_0."stof-dt"
        , stof_0."stof-qty-op"
        , stof_0."stof-qty-nop"
        , stof_0."stof-qty-brok"
        , stof_0."stof-qty-brok-ok"
        , stof_0."stof-qty-ext"
        , stof_0."stof-qty-dock"
        , stof_0."stof-qty-trans"
        , stof_0."stof-qty-diff"
        , stof_0."stof-qty-fin-qty"
        , stof_0."stof-qty-fin-temp"
        , stof_0."stof-am" 
        FROM NILOS.PUB.stof stof_0 
        WHERE (stof_0."arti-cd-base"=1) 
        AND (stof_0."arti-cd-sfx"=15) 
        AND (stof_0."adfc-cd-diffco"=0) 
    ) x
INNER JOIN ( SELECT stof_1."arti-cd-base"
            ,   MAX(stof_1."stof-dt") AS max_stof_dt
         FROM NILOS.PUB.stof stof_1 
         GROUP BY stof_1."arti-cd-base" ) y ON x"arti-cd-base" = y."arti-cd-base"
                                            AND x."stof-dt" = y."max_stof_dt"

这将返回结果集分区内行的序号,每个分区中的第一行从 1 开始。因此,在您的情况下,分区是 arti_cd_base,我们按每个分区的最早日期排序。每个分区的最旧日期总是有数字 1,这就是为什么这个函数的结果必须等于 1 的条件。

于 2019-08-13T09:29:31.870 回答
0

看起来您希望将最后一列的第一个值保留在聚合中。Oracle 提供此功能,使用keep

select "arti-cd-base", "arti-cd-sfx", "adfc-cd-diffco",  
       max("stof-dt") as "stof-dt",
       max("stof-qty-op") keep (dense_rank first order by "stof-dt" desc) as "stof-qty-op"
from t
group by "arti-cd-base", "arti-cd-sfx", "adfc-cd-diffco";
于 2019-08-13T11:34:53.370 回答