获取由同一表中的其他两个列值确定的列值的总和

akilat90

我有下表 MY_TABLE

ID | SEQ | TYPE | VAL
1  | 2   | A    | 100
1  | 3   | A    | 100
1  | 2   | B    | 200
1  | 3   | A    | 100
1  | 3   | B    | 200
2  | 25  | X    | 100
2  | 24  | Y    | 200
2  | 24  | X    | 300
2  | 25  | Y    | 400
2  | 25  | X    | 50

在 中MY_TABLE,每个ID都有一组Seq值和Type值。我想获得属于每个sVAL的总和TYPEIDmax(Seq)

预期输出:

ID| SEQ | TYPE | SUM(VAL)
1 | 3   | A    | 200  <- 100 + 100
1 | 3   | B    | 200  
2 | 25  | X    | 150  <- 100 + 50
2 | 25  | Y    | 400

我试过的:

-- this sub query finds the max(seq) for each ID
with max_seq as (
  select id, max(seq) max_seq
  from my_table t
  group by id)
-- select query on my_table
select
  bd.id,
  bd.seq,
  bd.type,
  sum(bd.val)
from my_table bd
-- joining on id-max_seq pair
inner join max_seq 
  on 
  (max_seq.id = bd.id)
  and
  (max_seq.max_seq = bd.seq)
-- sum(val) per ID, MAX(SEQ), TYPE
group by bd.id, bd.seq, bd.type;

问题:

上述查询适用于较小的表,但当表较大时会变慢。有没有一种有效的方法来获得这个输出?(也许不使用子查询在同一个表上使用两个连接?)

亚历克斯·普尔

您可以通过使用子查询来避免自联接,该子查询基于idand获取每一行的排名seq

select id, seq, type, sum(val)
from (
  select id, seq, type, val, rank() over (partition by id order by seq desc) as rnk
  from my_table
)
where rnk = 1
group by id, seq, type
order by id, seq, type;

        ID        SEQ T   SUM(VAL)
---------- ---------- - ----------
         1          3 A        200
         1          3 B        200
         2         25 X        150
         2         25 Y        400

因为的order by seq desc,该rnk值为1的最高seq的每个id然后外部查询只过滤rnk = 1,将输出和聚合限制为那些最低等级(最高seq)的行。

db<>小提琴演示

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MySQL-如何获取同一表的两个外键列的数据

来自分类Dev

当同一表中其他列的值为1时,将列的值返回为null或空

来自分类Dev

用同一表中不同条件的同一列的其他值更新一个表的值

来自分类Dev

按同一表中的两个值分组

来自分类Dev

MySQL-如何获取所有记录在同一表的其他列中

来自分类Dev

如何使用同一表中的其他两个列串联来更新列

来自分类Dev

尝试查找由其他两个键共享的表中的任何行(在同一表中)

来自分类Dev

尝试查找由其他两个键共享的表中的任何行(在同一表中)

来自分类Dev

无法更新同一表中两个现有值之和的值(MySQL)

来自分类Dev

R中的data.table:匹配其他两个列的值后,用同一列中的值替换一个列值

来自分类Dev

Apache Cassandra:使用同一表中其他列的值更新值

来自分类Dev

如何从同一表的同一列中获取不同的值-Oracle

来自分类Dev

创建一个列,该列是数据表中其他两个列的总和

来自分类Dev

检查表并根据同一表中两个匹配列的值使tr内容加粗

来自分类Dev

SQL查询基于同一表中其他列的值从表中提取日期?

来自分类Dev

从同一查询的同一列中获取两个值

来自分类Dev

选择与同一表上其他列值的组合匹配的列值

来自分类Dev

当同一表中其他列的值为1时,将列的值返回为null或为空

来自分类Dev

用同一表中不同条件的同一列的其他值更新一个表的值

来自分类Dev

MySQL查询以查找一个表中一列的值是否在另一表中两列的两个值之间

来自分类Dev

仅当使用MySQL的一个表中的列值与另一表中的列值相同时,才如何从两个表返回数据?

来自分类Dev

将同一表中的两个查询连接到不同的月份和总和值

来自分类Dev

SQL查询-查找同一表中两个值之间的差异

来自分类Dev

如何使用Entity Framework从SQL表中获取两个列值的总和?

来自分类Dev

SQL:通过限制来自同一表的其他值的长度来更新列值

来自分类Dev

根据同一表中的其他列值计算 sum(column)

来自分类Dev

SQL 查询将两列与另一表中的一列进行比较(并获得两个值)

来自分类Dev

需要使用单个 MySQL 查询在同一表内的其他列中设置两个日期字段的差异

来自分类Dev

从同一表中的两个单独的员工记录中获取新/旧值

Related 相关文章

  1. 1

    MySQL-如何获取同一表的两个外键列的数据

  2. 2

    当同一表中其他列的值为1时,将列的值返回为null或空

  3. 3

    用同一表中不同条件的同一列的其他值更新一个表的值

  4. 4

    按同一表中的两个值分组

  5. 5

    MySQL-如何获取所有记录在同一表的其他列中

  6. 6

    如何使用同一表中的其他两个列串联来更新列

  7. 7

    尝试查找由其他两个键共享的表中的任何行(在同一表中)

  8. 8

    尝试查找由其他两个键共享的表中的任何行(在同一表中)

  9. 9

    无法更新同一表中两个现有值之和的值(MySQL)

  10. 10

    R中的data.table:匹配其他两个列的值后,用同一列中的值替换一个列值

  11. 11

    Apache Cassandra:使用同一表中其他列的值更新值

  12. 12

    如何从同一表的同一列中获取不同的值-Oracle

  13. 13

    创建一个列,该列是数据表中其他两个列的总和

  14. 14

    检查表并根据同一表中两个匹配列的值使tr内容加粗

  15. 15

    SQL查询基于同一表中其他列的值从表中提取日期?

  16. 16

    从同一查询的同一列中获取两个值

  17. 17

    选择与同一表上其他列值的组合匹配的列值

  18. 18

    当同一表中其他列的值为1时,将列的值返回为null或为空

  19. 19

    用同一表中不同条件的同一列的其他值更新一个表的值

  20. 20

    MySQL查询以查找一个表中一列的值是否在另一表中两列的两个值之间

  21. 21

    仅当使用MySQL的一个表中的列值与另一表中的列值相同时,才如何从两个表返回数据?

  22. 22

    将同一表中的两个查询连接到不同的月份和总和值

  23. 23

    SQL查询-查找同一表中两个值之间的差异

  24. 24

    如何使用Entity Framework从SQL表中获取两个列值的总和?

  25. 25

    SQL:通过限制来自同一表的其他值的长度来更新列值

  26. 26

    根据同一表中的其他列值计算 sum(column)

  27. 27

    SQL 查询将两列与另一表中的一列进行比较(并获得两个值)

  28. 28

    需要使用单个 MySQL 查询在同一表内的其他列中设置两个日期字段的差异

  29. 29

    从同一表中的两个单独的员工记录中获取新/旧值

热门标签

归档