Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsSpDbGr 223 of 288 menu
◀ ▶

Группировка строк в Rust

Группировка через GROUP BY делит строки на группы с одинаковым значением столбца. Сводная функция считается отдельно внутри каждой группы, а в результате на группу приходится одна строка.

Посчитаем, сколько раз встречается каждое имя:

use rusqlite::Connection; fn names_stats() -> Result<(), rusqlite::Error> { let conn = Connection::open("app.db")?; let mut stmt = conn.prepare( "SELECT name, COUNT(*) FROM user GROUP BY name", )?; let rows = stmt.query_map([], |row| { let label: String = row.get(0)?; let qty: i64 = row.get(1)?; Ok((label, qty)) })?; for item in rows { let (label, qty) = item?; println!("{} {}", label, qty); } Ok(()) } fn main() { match names_stats() { Ok(()) => {}, Err(e) => println!("{}", e), } }

На экране пары имя и счетчик. Имена с одним написанием сливаются в одну группу.

К группировке можно добавить условие на результат через HAVING:

use rusqlite::Connection; fn popular() -> Result<(), rusqlite::Error> { let conn = Connection::open("app.db")?; let mut stmt = conn.prepare( "SELECT name, COUNT(*) AS c FROM user GROUP BY name HAVING c > 1", )?; let rows = stmt.query_map([], |row| row.get::<_, String>(0))?; for name in rows { println!("{}", name?); } Ok(()) } fn main() { if let Err(e) = popular() { println!("{}", e); } }

Дана таблица:

1 ann 2 bob 3 ann 4 ann

Выведите имя ann и число строк в группе для этого имени.

Дана таблица user. Сгруппируйте по name и выведите только группы, где счетчик больше 1.

Скажите, чем HAVING отличается от WHERE при группировке.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить