Базы данных и всё, что с ними связано!
Сотрудничество: @haarrp
РКН № 6766085482
Post #1219
3.36K
SQ @databases_tg
Showing posts older than #1220 · Back to latest
SELECT * FROM users WHERE email = ?
Forwarded from Machinelearning
SELECT *
FROM sales
QUALIFY ROW_NUMBER() OVER (ORDER BY amount DESC) = 1;
CREATE INDEX idx_orders_active
ON orders(status)
WHERE status = 'active';

duckdb.sql("SET memory_limit = '500MB'")
duckdb.sql("SET temp_directory = '/tmp/duckdb_temp'")
result = duckdb.sql(f"SELECT * FROM '{parquet_path}'").df()
CREATE TABLE articles (
id serial PRIMARY KEY,
title text,
body text
);
CREATE INDEX idx_articles_fts
ON articles
USING gin (to_tsvector('russian',
coalesce(title,'') ' ' coalesce(body,'')));
SELECT id, title
FROM articles
WHERE to_tsvector('russian',
coalesce(title,'') ' ' coalesce(body,''))
@@ plainto_tsquery('russian', 'sql поиск производительность');

docker run -d
--name postgresus
-p 4005:4005
-v ./postgresus-data:/postgresus-data
--restart unless-stopped
rostislavdugin/postgresus:latest

SELECT, а про настоящую инженерную работу: принципы нормализации, дизайн схем, практики оптимизации SQL, работа с транзакциями, и главное - как выбрать и использовать ORM так, чтобы он помогал, а не мешал.
-- плохой вариант: тянем все колонки
SELECT *
FROM orders
WHERE customer_id = 42
AND status = 'PAID';
-- лучше: только нужные поля (можно сделать covering index)
SELECT id, total_amount, paid_at
FROM orders
WHERE customer_id = 42
AND status = 'PAID';
Медленно: OR ломает индексы
SELECT *
FROM users
WHERE status = 'active'
OR created_at > NOW() - INTERVAL '30 days';
-- Быстро: каждое условие использует свой индекс
SELECT * FROM users
WHERE status = 'active'
UNION ALL
SELECT * FROM users
WHERE created_at > NOW() - INTERVAL '30 days'
AND status <> 'active';
SELECT percentile_cont (0.5) WITHIN GROUP (ORDER BY sales) FROM table;
SELECT percentile_cont (0.5) WITHIN GROUP (ORDER BY sales) OVER (PARTITION BY 1) FROM table;
SELECT MEDIAN (sales) OVER (PARTITION BY 1) FROM table; /*задаем переменную row_index = -1, чтобы отсчет индекса начался с 0 */
SET @row_index := -1;
/*находим среднее двух значений в центре отсортированного набора. Охватывает те случаи, когда общее число записей четное*/
SELECT AVG (subq.sales) as median_value
FROM (
SELECT @row_index:=@row_index + 1 AS row_index, sales
FROM table
ORDER BY sales
) AS subq
WHERE subq.row_index
/*выбираем только значения в центре: одно если число записей нечетное и два если четное*/
IN (FLOOR(@row_index / 2) , CEIL(@row_index / 2));


