【问题标题】:Find difference (recent value - value prior to the most recent datetime) in SQL在 SQL 中查找差异(最近的值 - 最新日期时间之前的值)
【发布时间】:2021-04-16 22:28:15
【问题描述】:

对于下图中给出的表 t1, 如何在sql中找到每个UserID,ProductID对的PurchaseAmount Diffenrece?

差异 = 最近的值 - 最近日期时间之前的值

这只是较大数据的一部分,PurchaseTime 包含 UserID、ProductID 对的更多日期时间

最终结果将如下所示:

【问题讨论】:

  • 编辑您的问题并显示您期望的结果。另外,标记您真正使用的数据库。
  • edit 澄清您的问题,包括:用您正在使用的 RDBMS 的名称标记问题;以及如何计算增量的说明(是MAX - MIN 还是LATEST - EARLIEST 或其他?)

标签: sql oracle


【解决方案1】:

您可以使用LEADROW_NUMBER 解析函数:

SELECT userid,
       productid,
       purchasetime,
       DeltaPurchaseAmount
FROM   (
  SELECT userid,
         productid,
         purchasetime,
         productamount
           - LEAD( productamount, 1, 0 ) OVER (
               PARTITION BY userid, productid
               ORDER BY purchasetime DESC
             )
           AS DeltaPurchaseAmount,
         ROW_NUMBER() OVER (
           PARTITION BY userid, productid
           ORDER BY purchasetime DESC
         )
           As rn
  FROM   table_name
)
WHERE rn = 1;

其中,对于 Oracle 中的示例数据:

CREATE TABLE table_name ( userid, productid, purchasetime, productamount ) AS
SELECT 1001, 901, DATE '2021-01-12', 100 FROM DUAL UNION ALL
SELECT 1001, 901, DATE '2021-01-11',  75 FROM DUAL UNION ALL
SELECT 1001, 905, DATE '2021-01-12', 150 FROM DUAL UNION ALL
SELECT 1001, 905, DATE '2021-01-11', 100 FROM DUAL UNION ALL
SELECT 1001, 999, DATE '2021-01-12', 100 FROM DUAL UNION ALL
SELECT 1002, 901, DATE '2021-01-12', 220 FROM DUAL UNION ALL
SELECT 1002, 905, DATE '2021-01-12', 215 FROM DUAL UNION ALL
SELECT 1002, 905, DATE '2021-01-11', 200 FROM DUAL UNION ALL
SELECT 1002, 999, DATE '2021-01-12', 250 FROM DUAL UNION ALL
SELECT 1002, 999, DATE '2021-01-11', 100 FROM DUAL;

(为了简单起见,使用了午夜的日期,但是当时间不是午夜时它仍然有效。)

给予:

用户名 |产品ID |购买时间 |三角洲采购量 -----: | --------: | :----------------- | ------------------: 1001 | 901 | 2021-01-12 00:00:00 | 25 1001 | 905 | 2021-01-12 00:00:00 | 50 1001 | 999 | 2021-01-12 00:00:00 | 100 1002 | 901 | 2021-01-12 00:00:00 | 220 1002 | 905 | 2021-01-12 00:00:00 | 15 1002 | 999 | 2021-01-12 00:00:00 | 150

db小提琴here

【讨论】:

    【解决方案2】:

    我认为这应该可行:

    Select UserId, ProductID, Max(PurchaseAmount) - Min(PurchaseAmount) AS Delta
    From t1
    Group By UserId, ProductID
    

    【讨论】:

    • 我忘了说真实数据中涉及的日期更多..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多