【问题标题】:sorting data in oracleoracle中的数据排序
【发布时间】:2020-02-13 21:25:32
【问题描述】:

我有一个棘手的场景。

表中数据如下

CustomerId  Transaction Type    Transaction Amount
1               Payment          100
1               payment          200
1               ReversePayment  -100
1               ReversePayment  -200

我有交易类型为“付款”、“反向付款”的跨国表。一个客户有多个记录,其中一些记录是 Payment,一些是 ReversePayment。

有没有办法按如下方式对数据进行排序

CustomerId  Transaction Type    Transaction Amount
1               Payment              100
1               ReversePayment      -100
1               payment              200
1               ReversePayment      -200

如果有人有解决办法,请帮忙。

【问题讨论】:

  • 您仍然没有告诉我们必须遵循什么逻辑才能达到该顺序(无论是否或如何在代码中完成)。我们可以猜测一下:您想在连续的行上同时显示“匹配”付款和反向付款。是这样吗?如果是这样 - 反向付款是否总是与付款相匹配(也许,可能有一些“付款”没有被撤销,你最后需要那些?你也需要澄清这一点。)这不可能吗?例如,有 100 和 200 的付款,以及 -300 的 反向付款?
  • 如果是后者,你需要看一下payment或payments是或are被单次ReversePayment逆转,那么(1)问题通常不再有唯一的解决方案,并且 (2) 问题要困难得多。
  • 逻辑不清楚。投票结束。
  • 嗨,mathguy,是的,你是正确的。我的要求是在连续的行中同时显示“匹配”付款和反向付款

标签: sql database oracle sql-order-by analytical


【解决方案1】:

对于这个数据集,应该这样做:

order by
    customerId,
    abs(transaction_amount),
    transaction_amount desc

这种排序不关心交易类型,而只关心金额。金额绝对值的标准将具有相反值的记录联系起来,然后下一个标准将正值放在首位。

【讨论】:

  • OP还是需要充分说明逻辑;但是,如果要在其撤销的付款下显示每笔反向付款,那么您的解决方案将不会给出预期的结果 - 特别是当有等额的付款(和相应的撤销)时。例如:两次支付 100 和两次冲销 -100。您的解决方案将显示 100、100、-100、-100,而实际上所需的结果是 100、-100、100、-100(如果事实上这是所需的结果)。
  • 顺便说一句,我看到答案已经有(在我写这篇文章的时候)两个赞成票和一个反对票。这些都不是我的。特别是投反对票的人没有解释他们的投反对票。
  • @mathguy:同意。我清楚地提到了这适用于这个数据集。我理解您所说的:要使其正常工作,我们需要一个额外的列来以某种方式定义付款顺序(或组)......这未显示在示例数据中。
  • 或者我们可以创建自己的此类列,例如 ROW_NUMBER。但是在 OP 明确要求之前,我不会推测(更不用说编写解决方案)。解决 OP 甚至可能没有的问题毫无意义。
  • 您好 GMB,您的答案适用于 90% 的数据。剩余 10% 的数据具有相同的金额,如下所示CustomerId Transaction Type Transaction Amount 1 Payment 100 1 payment 100 1 ReversePayment -100 1 ReversePayment -100 我想要输出类似 CustomerId Transaction Type Transaction Amount 1 Payment 100 1 ReversePayment -100 1 payment 100 1 ReversePayment - 100
【解决方案2】:

问题尚不清楚,但我的解释是 OP 希望将付款和反向交错。这表明了窗口函数:

order by customerid,
         abs(transactionamount),
         row_number() over (partition by customerid, transactiontype, abs(transactionamout) order by customerid),
         transactiontype asc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 2013-08-26
    • 2023-01-09
    • 2010-10-07
    • 2019-12-25
    • 1970-01-01
    相关资源
    最近更新 更多