Django - 获取两个字段相等时另一个字段的总和

3

我有一个表,其中包含字段 bytes_inmac_srcmac_dst

我想要获取所有行中 mac_srcmac_dst 字段相等的记录的 bytes_in 字段总和,并将这个总和从高到低排序。返回的 Queryset 应该每个 mac_srcmac_dst 值只有一条记录。

换句话说,我需要对 bytes_in 字段进行求和,就好像 mac_srcmac_dst 是同一个字段且具有相同的值一样。

谢谢。

+-------------------+-------------------+----------+
| mac_src           | mac_dst           | bytes_in |
+-------------------+-------------------+----------+
| aa:aa:aa:aa:aa:aa | bb:bb:bb:bb:bb:bb |       10 |
| bb:bb:bb:bb:bb:bb | aa:aa:aa:aa:aa:aa |       20 |
| cc:cc:cc:cc:cc:cc | aa:aa:aa:aa:aa:aa |       30 |
+-------------------+-------------------+----------+
3个回答

0
select
  t1.mac_src as mac,
  t1.sum_bytes_in + t2.sum_bytes_in as sum_bytes_in
from
  (select
    mac_src,
    sum(bytes_in) as sum_bytes_in
  from tbl
  group by mac_src) as t1
  inner join
  (select
    mac_dst,
    sum(bytes_in) as sum_bytes_in
  from tbl
  group by mac_dst) as t2
  on t1.mac_src = t2.mac_dst
order by sum_bytes_in desc

假设对于任何行,row.mac_src != row.mac_dst。


你能解释一下你的解决方案吗? - Bulat

0
select mac_src,sum(case when mac_src=mac_dst then bytes_in else null end)
from table
group by mac_src
order by sum(case when mac_src=mac_dst then bytes_in else null end) desc;

谢谢回答。我尝试使用Django的raw()方法运行它,但返回为空。 - Neurion

0
from django.db.models import F, Sum

items = (
    Item.objects
    .filter(mac_src=F('mac_dst'))
    .values('mac_src', 'mac_dst')
    .annotate(sum_bytes=Sum('bytes_in'))
    .order_by('-sum_bytes')
)

它不起作用。看了其他在线示例,我同意你的观点,它应该可以工作。我手动检查了mac_srcmac_dst是否有匹配的值,并确认它们是匹配的。 - Neurion
你能提供一些模型和值的例子,说明它不起作用的情况吗? - f43d65
我应该在问题上更加具体,我需要找到mac_srcmac_dst相等且在不同行的总和。我添加了一个包含三行的示例。如果我想找到mac_src == mac_dstbytes_in的总和,则会返回aa:aa:aa:aa:aa:aamac_srcmac_dst相等的60,并返回bb:bb:bb:bb:bb:bbmac_srcmac_dst相等的30。谢谢。 - Neurion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接