NOT EXISTS flows
(
SrcAddr FixedString(16),
DstAddr FixedString(16),
Bytes UInt64
)
Надо объединить колонки SrcAddr и DstAddr в одну колонку Addr и посчитать сумму по байтам. SELECT UNION? Или как-то лучше есть вариант?
select concat(srcaddr,dstaddr) as addr
они разные, мне два значения в одну колонку, следом Addr ——- SrcAddr1 DstAddr1 SrcAddr2 DstAddr2
неважно совершенно
neighbor помогбы
сдвигать не нужно
в таблице куча разных источников и получателей, но потоки между ними могут быть в разном порядке. где-то один и тот же адрес источник, где-то он получатель. надо посчитать сумму байт по конкретному адресу, неважно, в какую сторону данные передавались
да, просто select ... union all select ... чего выдумывать
SELECT number AS id1, number+10 AS id2, (number + 1)*10 AS Bytes FROM system.numbers LIMIT 10 ┌─id1─┬─id2─┬─Bytes─┐ │ 0 │ 10 │ 10 │ │ 1 │ 11 │ 20 │ │ 2 │ 12 │ 30 │ │ 3 │ 13 │ 40 │ │ 4 │ 14 │ 50 │ │ 5 │ 15 │ 60 │ │ 6 │ 16 │ 70 │ │ 7 │ 17 │ 80 │ │ 8 │ 18 │ 90 │ │ 9 │ 19 │ 100 │ └─────┴─────┴───────┘ SELECT id1 AS id, SUM(Bytes) AS sumBytes FROM ( SELECT number AS id1, number+10 AS id2, (number + 1)*10 AS Bytes FROM system.numbers LIMIT 10 ) GROUP BY id1 UNION ALL SELECT id2 AS id, SUM(Bytes) AS sumBytes FROM ( SELECT number AS id1, number+10 AS id2, (number + 1)*10 AS Bytes FROM system.numbers LIMIT 10 ) GROUP BY id2 ┌─id─┬─sumBytes─┐ │ 0 │ 10 │ │ 4 │ 50 │ │ 3 │ 40 │ │ 2 │ 30 │ │ 5 │ 60 │ │ 1 │ 20 │ │ 6 │ 70 │ │ 7 │ 80 │ │ 9 │ 100 │ │ 8 │ 90 │ └────┴──────────┘ ┌─id─┬─sumBytes─┐ │ 14 │ 50 │ │ 18 │ 90 │ │ 19 │ 100 │ │ 15 │ 60 │ │ 16 │ 70 │ │ 12 │ 30 │ │ 11 │ 20 │ │ 10 │ 10 │ │ 13 │ 40 │ │ 17 │ 80 │ └────┴──────────┘ лучше способа, получается, нет?
я, похоже, вашу задачу не понял я думал, вам нужно select addr, sum(bytes) from (select srcAddr as addr, bytes from table union all select dstAddr as addr, bytes from table) group by addr
вам нужен общий трафик для каждого адреса? лучше так чтобы два прохода по таблице не делать select arrayJoin([id1,id2]) as id, sum(Bytes) from (SELECT number AS id1, number+10 AS id2, (number + 1)*10 AS Bytes FROM system.numbers LIMIT 10) group by id;
так тоже работает, но выглядит расточительным по оперативе: SELECT id, SUM(Bytes) FROM ( SELECT id1 AS id, Bytes FROM ( SELECT number AS id1, number+10 AS id2, (number + 1)*10 AS Bytes FROM system.numbers LIMIT 10 ) UNION ALL SELECT id2 AS id, Bytes FROM ( SELECT number AS id1, number+10 AS id2, (number + 1)*10 AS Bytes FROM system.numbers LIMIT 10 ) ) GROUP BY id ┌─id─┬─sum(Bytes)─┐ │ 0 │ 10 │ │ 4 │ 50 │ │ 3 │ 40 │ │ 2 │ 30 │ │ 5 │ 60 │ │ 1 │ 20 │ │ 6 │ 70 │ │ 7 │ 80 │ │ 9 │ 100 │ │ 14 │ 50 │ │ 18 │ 90 │ │ 19 │ 100 │ │ 15 │ 60 │ │ 8 │ 90 │ │ 16 │ 70 │ │ 12 │ 30 │ │ 11 │ 20 │ │ 10 │ 10 │ │ 13 │ 40 │ │ 17 │ 80 │ └────┴────────────┘
похоже, что нужно. спасибо!
select addr, sum(bytes) from flows array join [SrcAddr, DstAddr] as addr, [0, Bytes] as bytes group by addr
Обсуждают сегодня