Size: a a a

pgsql – PostgreSQL

2020 August 04

EK

Evgeny Kuzin in pgsql – PostgreSQL
Alexander Myodov
А PostgreSQL точно хотя бы 9.0? А то в 9.0 ON ALL TABLES уже было, а в 8.4 — ещё нет
Вы выше почитайте хоть, чтобы понимать о чем вопрос :) Постгрес вообще 12
источник

АВ

Артем Вершинин... in pgsql – PostgreSQL
Добрый день! Подскажите, пожалуйста, статью по созданию пользовательской роли для БД по умолчанию с минимальными правами без доступа к системным объектам.
Стоит ли забирать права на доступ к схемам pg_catalog и information_schema? Была информация - если нет доступа к схеме pg_catalog, пользователь не сможет выполнить даже самый простой запрос SELECT - планировщик не будет иметь доступа к определениям таблиц.
источник

XN

Xeon Null in pgsql – PostgreSQL
Господа, есть вопрос по запросу
источник

XN

Xeon Null in pgsql – PostgreSQL
есть табличка order c полями id,company_id,status,created_at,number все кроме number числа, number строка
источник

XN

Xeon Null in pgsql – PostgreSQL
есть агрегатный запрос

SELECT count(1) AS "cnt",
      "company_id"
FROM "order"
WHERE "status" = 20
 and company_id = 119
GROUP BY "company_id"

статусов может быть много,
нужно добавить number из строки у который самый большой created_at
источник

XN

Xeon Null in pgsql – PostgreSQL
итоговая табличка: cnt,company_id,last_number
источник

XN

Xeon Null in pgsql – PostgreSQL
пытался через оконную, не получилось)
источник

XN

Xeon Null in pgsql – PostgreSQL
что то типа такого  
max(number) filter (where max(created_at))
но
1. не нашел агрегатную функцию типа взять первую строку.
2. нельзя в оконных использовать агрегатные
источник

XN

Xeon Null in pgsql – PostgreSQL
как это можно сделать?
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Xeon Null
есть табличка order c полями id,company_id,status,created_at,number все кроме number числа, number строка
Лучше б Вы CREATE TABLE или \d показали...
источник

IC

Igor Chizhov in pgsql – PostgreSQL
Xeon Null
что то типа такого  
max(number) filter (where max(created_at))
но
1. не нашел агрегатную функцию типа взять первую строку.
2. нельзя в оконных использовать агрегатные
Недавно на подобной задаче пробовали два варианта - подзапросом и джойном. Подзапросом оказалось очень долго, за час не отработал. С джойном за минуту.
источник

XN

Xeon Null in pgsql – PostgreSQL
это уже запрос в join)
источник

XN

Xeon Null in pgsql – PostgreSQL
SELECT "id", "legal_entity", "brand", "cntr"."cnt"
FROM "company"
        LEFT JOIN (SELECT count(1) AS "cnt", "company_id" FROM "order" WHERE "status" = 20 GROUP BY "company_id") cntr
                  ON id = cntr.company_id
WHERE NOT ("cnt" IS NULL)
ORDER BY "cnt" DESC
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Xeon Null
пытался через оконную, не получилось)
Вложенный запрос нужен, что-то вроде:
SELECT COUNT(*) AS cnt, company_id, last_number
 FROM (
      SELECT created_at, number, company_id,
             first_value(number) OVER (ORDER BY created_at DESC) AS last_number
        FROM "order"
       WHERE status = 20 AND company_id = 119
      ) AS nq
GROUP BY company_id, last_number;

А вообще, это всё тот же groupwise maximum, т.е. тут можно и подзапросом, и JOIN-ом и т.п.
Кстати, для подсчёта записей обычно используется COUNT(*) — это стандартное выражение для "количество rows".
источник

XN

Xeon Null in pgsql – PostgreSQL
вроде байка с мускула тянется, что 1 быстрее *
источник

XN

Xeon Null in pgsql – PostgreSQL
все, понял извиняюсь
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Xeon Null
вроде байка с мускула тянется, что 1 быстрее *
Причём тут какой-то "мускул"? ;) Тем более, что это почти наверняка именно байка и не более того.
В любом случае, писать запросы стоит так, чтобы было понятно, а не превращать их в "спагетти" ради 0.01% производительности.
источник

XN

Xeon Null in pgsql – PostgreSQL
Yaroslav Schekin
Вложенный запрос нужен, что-то вроде:
SELECT COUNT(*) AS cnt, company_id, last_number
 FROM (
      SELECT created_at, number, company_id,
             first_value(number) OVER (ORDER BY created_at DESC) AS last_number
        FROM "order"
       WHERE status = 20 AND company_id = 119
      ) AS nq
GROUP BY company_id, last_number;

А вообще, это всё тот же groupwise maximum, т.е. тут можно и подзапросом, и JOIN-ом и т.п.
Кстати, для подсчёта записей обычно используется COUNT(*) — это стандартное выражение для "количество rows".
тут кстати ошибка если убрать фильтр по company_id из самого вложенного запроса
источник

XN

Xeon Null in pgsql – PostgreSQL
last_number должен быть в контексте company_id а не вообще
источник

XN

Xeon Null in pgsql – PostgreSQL
cnt         company_id    last_number
1  49  20-119-0222
2  119  20-119-0222
источник