Группировка строк в 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 при группировке.