【问题标题】:Filter rows where 2 column values appear more than once过滤 2 列值出现多次的行
【发布时间】:2021-03-14 15:02:19
【问题描述】:

我有一张这样的桌子:

SELECT
s.date,
s.orderid,
s.num1,
s.num2,
s.sales,
s.price
FROM sales AS s

导致

date       | orderid | num1 | num 1 | sales | price
2020-11-01 | 1       | a    | aa    | 1     | 10
2020-11-01 | 8       | k    | kk    | 1     | 10
2020-11-02 | 1       | a    | aa    | -1    | 10
2020-11-01 | 2       | b    | bb    | 2     | 8
2020-11-01 | 3       | c    | cc    | 1     | 10
2020-11-01 | 3       | c    | cc    | 2     | 9
2020-11-04 | 18      | u    | uu    | 5     | 2

“orderid”和“num1”只能出现一次,否则返回(第二个条目的“sales”为-1,否定之前的sales。 所以,我需要完全删除这些条目(而不是保留一行)。否则,“orderid”没有意义,也不需要。

我想按“date”、“num1”和“num2”分组,汇总所有销售额并获得平均价格,同时删除一起出现多次的orderids+num1。

最终结果应该是:

date       | orderid | num1 | num 1 | sales | price
2020-11-01 | 8       | k    | kk    | 1     | 10
2020-11-01 | 2       | b    | bb    | 2     | 8
2020-11-01 | 3       | c    | cc    | 3     | 9.5
2020-11-04 | 18      | u    | uu    | 5     | 2

如何使用 Groupby 做到这一点?到目前为止,我有这个:

SELECT
s.date,
s.num1,
s.num2,
SUM(s.sales),
AVG(s.price)
FROM sales AS s
GROUP BY s.date, s.num1, s.num2

【问题讨论】:

    标签: sql oracle group-by having


    【解决方案1】:

    您可以使用窗口函数。根据您的描述(删除多次出现的订单),您可以使用count(*)

    select s.date, s.num1, s.num2, SUM(s.sales), AVG(s.price)
    from (select s.*, count(*) over (partition by orderid, num1) as cnt
          from sales s
         ) s
    where cnt = 1
    group by s.date, s.num1, s.num2;
    

    我怀疑你真的想要row_number(),所以你保留其中一个重复的行。

    【讨论】:

    • 不,我不需要保留一行,返回需要完全过滤掉。
    • @Vega。 . .所以我的怀疑是错误的,但答案是正确的。
    【解决方案2】:

    您可以使用group byhaving,如下所示:

    SELECT max(s.date) as date,
           S.orderid,
           s.num1,
           s.num2,
           SUM(s.sales),
           AVG(s.price)
      FROM sales AS s
    GROUP BY s.orderid, s.num1, s.num2
    Having sum(sales) > 0;
    

    【讨论】:

      【解决方案3】:

      问题:

      这是一个事务日志,其中您的 orderId 1 和销售条目 10、5、-1、7、8 应该导致值 15? 10 和 5 被 -1 否定。如果是这样,您需要执行以下查询:a) 查找该 orderId 的最后一个 -1 之后的所有行,并对销售值求和。

      这种情况是相同 orderId 的销售值 5、6、-1、7、9、-1、10、2 应该只使用 10 和 2 作为最终金额

      类似

      查询 1 - 查找销售额为 -1 的每个订单 ID 的最大(日期)值 查询 2 - 使用查询 1 获取每个 orderId 的所有交易,其中日期 > 查询 1 中的日期

      WITH(在此处定义查询 1)
      选择 s.OrderId,Sum(s.sales) 作为 TotalSales,Avg(s.Price) 作为 AveragePrice
      来自销售人员
      左外连接(查询 1)q1 ON q1.OrderId
      WHERE (q1.Date 为空) OR (s.Date > q1.Date)
      GROUP BY s.OrderId

      【讨论】:

      • 这是 Oracle 数据库中的销售日志。每笔销售都记录在一行中,然后如果客户返回一个好货,则使用相同的 orderid 和 num1 创建另一个条目,但数量为负,因此销售 + 退货 = 销售 0。但我需要为我的用例一起删除这些条目。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 2022-08-09
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      相关资源
      最近更新 更多