SQLAlchemy过滤掉在多列中没有区别的行

埃里索

假设我在这样的表上有数据:

id | other_id | category | amount
--------------------------------
1  | abc      | widget   | 100
2  | abc      | widget   | 200
3  | def      | widget   | 100
4  | ghi      | gadget   | 100
5  | ghi      | gadget   | 100
6  | jkl      | gadget   | 100
7  | jkl      | gadget   | 100

我想查询该表以返回

(other_id, category, sum_of_amount)

哪里sum_of_amountamount同一列中所有行总和other_id除了这个,我要排除其中的组合的元组categorysum_of_amount不是唯一的。因此查询应返回元组:

(abc, widget, 300)
(def, widget, 100)

而不是任何gadget行,因为组合(gadget, 200)不是唯一的。

到目前为止,我有这个:

with session_scope() as db_session:
  query = db_session.query(
    ModelClass.other_id,
    ModelClass.category,
    label('sum_of_amount', func.sum(ModelClass.amount))
  ).group_by(
    ModelClass.other_id,
    ModelClass.category
  )

该查询未过滤掉任何内容。我想我需要使用独特的方式,但我不知道。

yoloseem

您可以(ohter_id, category, sum_of_amount)根据查询生成查询的结果集

=# SELECT other_id, category, SUM(amount) AS sum_of_amount
FROM test
GROUP BY other_id, category;

 other_id │ category │ sum_of_amount
──────────┼──────────┼───────────────
 abc      │ widget   │           300
 ghi      │ gadget   │           200
 jkl      │ gadget   │           200
 def      │ widget   │           100
(4 rows)

然后,您必须排除(category, sum_of_amount)不唯一的在上述确定每一行唯一性的结果集中,您可以添加新列,其中包含具有相同行数的行,(category, sum_of_amount)如下所示:

=# SELECT other_id, category, SUM(amount) AS sum_of_amount,
COUNT(*) OVER (PARTITION BY category, SUM(amount)) AS duplicates
FROM test
GROUP BY other_id, category;

 other_id │ category │ sum_of_amount │ duplicates
──────────┼──────────┼───────────────┼───────
 ghi      │ gadget   │           200 │     2
 jkl      │ gadget   │           200 │     2
 def      │ widget   │           100 │     1
 abc      │ widget   │           300 │     1
(4 rows)

正如您在上面的演示中所看到的,您手中有行列式。现在,您可以通过WHERE使用duplicates添加子句来生成要查找的结果集由于WHERE子句中不允许使用窗口函数(OVER一部分duplicates),并且我们必须在计算总金额后评估窗口函数的结果,因此必须使用子查询。

=# SELECT other_id, category, sum_of_amount
FROM (
  SELECT other_id, category, SUM(amount) AS sum_of_amount,
  COUNT(*) OVER (PARTITION BY category, SUM(amount)) AS duplicates
  FROM test
  GROUP BY other_id, category
) d
WHERE duplicates = 1
ORDER BY other_id, category;

 other_id │ category │ sum_of_amount
──────────┼──────────┼───────────────
 abc      │ widget   │           300
 def      │ widget   │           100
(2 rows)

以上SQL的SQLAlchemy查询表达式可以是:

from sqlalchemy import func, over
sum_of_amount = label('sum_of_amount', func.sum(ModelClass.amount))
duplicates = over(func.count('*'),
                  partition_by=(ModelClass.category, sum_of_amount))
query = db_session.query(
    ModelClass.other_id,
    ModelClass.category,
    sum_of_amount,
    duplicates,
  ).group_by(
    ModelClass.other_id,
    ModelClass.category
  ).from_self(
    ModelClass.other_id,
    ModelClass.category,
    sum_of_amount
  ).filter(duplicates == 1)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

根据行中的值过滤掉行而不是列

来自分类Dev

无法从数据框中过滤掉具有空列值的行

来自分类Dev

过滤掉在表中出现多次的条目

来自分类Dev

当任何列中的其他表中有单词时,将Pyspark中的行过滤掉

来自分类Dev

如何使用GREP过滤掉下面没有数据的行?

来自分类Dev

OrderBy过滤掉EntityFieldQuery中具有空字段的行

来自分类Dev

过滤掉包含“**”的数据框中的所有行

来自分类Dev

matlab - 按特定列的条件过滤掉行

来自分类Dev

使用Pandas过滤掉特定列中的值

来自分类Dev

过滤掉对象数组中的现有对象

来自分类Dev

过滤掉尾巴-f的重复行

来自分类Dev

R-在X列中过滤掉包含一个以上字符串的行

来自分类Dev

从valgrind输出中过滤掉垃圾

来自分类Dev

如何从项目列表中过滤掉

来自分类Dev

过滤掉Java中的价格或成本

来自分类Dev

过滤掉对象中的特定键

来自分类Dev

过滤掉PHP中的部分单词

来自分类Dev

在Hibernate没有StatelessSession防止过滤掉重复有一个热心的JOIN时

来自分类Dev

如何使用正则表达式过滤掉没有逗号的内容?

来自分类Dev

信号处理 - 为什么信号在我的截止频率没有被完全过滤掉?

来自分类Dev

EF Core 2.2 脚手架现有数据库 - 有没有办法从模型中过滤掉表

来自分类Dev

从 dplyr 中两个变量的值都 = 0 的数据集行中过滤掉

来自分类Dev

是否可以在中间件中过滤掉一些数据库行?

来自分类Dev

列表视图使用Flutter中的属性过滤掉最后一行数据

来自分类Dev

使用LINQ过滤掉文本文件C#中的行

来自分类Dev

如何一起使用“lt”和“gt”来过滤掉DataFrame中的错误行?

来自分类Dev

过滤掉标记属性或其CSS中具有“ display:none”的HTML元素

来自分类Dev

使用Python 3过滤掉文本中的所有非汉字字符

来自分类Dev

Java过滤掉文件中的单词,即使很少有空格出现

Related 相关文章

  1. 1

    根据行中的值过滤掉行而不是列

  2. 2

    无法从数据框中过滤掉具有空列值的行

  3. 3

    过滤掉在表中出现多次的条目

  4. 4

    当任何列中的其他表中有单词时,将Pyspark中的行过滤掉

  5. 5

    如何使用GREP过滤掉下面没有数据的行?

  6. 6

    OrderBy过滤掉EntityFieldQuery中具有空字段的行

  7. 7

    过滤掉包含“**”的数据框中的所有行

  8. 8

    matlab - 按特定列的条件过滤掉行

  9. 9

    使用Pandas过滤掉特定列中的值

  10. 10

    过滤掉对象数组中的现有对象

  11. 11

    过滤掉尾巴-f的重复行

  12. 12

    R-在X列中过滤掉包含一个以上字符串的行

  13. 13

    从valgrind输出中过滤掉垃圾

  14. 14

    如何从项目列表中过滤掉

  15. 15

    过滤掉Java中的价格或成本

  16. 16

    过滤掉对象中的特定键

  17. 17

    过滤掉PHP中的部分单词

  18. 18

    在Hibernate没有StatelessSession防止过滤掉重复有一个热心的JOIN时

  19. 19

    如何使用正则表达式过滤掉没有逗号的内容?

  20. 20

    信号处理 - 为什么信号在我的截止频率没有被完全过滤掉?

  21. 21

    EF Core 2.2 脚手架现有数据库 - 有没有办法从模型中过滤掉表

  22. 22

    从 dplyr 中两个变量的值都 = 0 的数据集行中过滤掉

  23. 23

    是否可以在中间件中过滤掉一些数据库行?

  24. 24

    列表视图使用Flutter中的属性过滤掉最后一行数据

  25. 25

    使用LINQ过滤掉文本文件C#中的行

  26. 26

    如何一起使用“lt”和“gt”来过滤掉DataFrame中的错误行?

  27. 27

    过滤掉标记属性或其CSS中具有“ display:none”的HTML元素

  28. 28

    使用Python 3过滤掉文本中的所有非汉字字符

  29. 29

    Java过滤掉文件中的单词,即使很少有空格出现

热门标签

归档