Size: a a a

pgsql – PostgreSQL

2020 July 02

YS

Yaroslav Schekin in pgsql – PostgreSQL
Максим
Добрый день! Подскажите, как составить запрос, если у меня 2 таблицы, первая с логами (ид, дата, действие...) , а вторая с датой исключений (дата начало, дата конец), вот я хочу вытянуть условно все логи, кроме диапазонов которые в исключениях
Казалось бы, что-то вроде:
SELECT ... 
 FROM "первая с логами" AS a
WHERE NOT EXISTS (
      SELECT 1
        FROM "вторая с датой исключений" AS x
       WHERE a.дата >= x."дата начало" AND a.дата <= x."дата конец"
      )
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Vladi
получить юзеров позднее двух дней, но интересовал такой каст
Какой cast? Никаких типов данных на картинке я не вижу...
источник

М

Максим in pgsql – PostgreSQL
Yaroslav Schekin
Казалось бы, что-то вроде:
SELECT ... 
 FROM "первая с логами" AS a
WHERE NOT EXISTS (
      SELECT 1
        FROM "вторая с датой исключений" AS x
       WHERE a.дата >= x."дата начало" AND a.дата <= x."дата конец"
      )
Супер! спасибо, про NOT EXISTS не знал)
источник

AN

Artem Nemtsev in pgsql – PostgreSQL
Всем привет. Есть таблица Users в отношении с другими таблицами (Run, Ride, Swim, etc)
Стоит задача одним запросом вытащить всех Users и к каждому юзеру прикрепить сумму километров из таблиц с отношениями
Но запрос ниже не работает со всеми вместе, ибо с каждым джоином повторяющихся данных все больше и больше
Как можно решить эту проблему?
SELECT
 "user"."id",
 "user"."name",
 SUM("run"."km") AS "run_km",
 SUM("ride"."km") AS "ride_km",
 SUM("swim"."km") AS "swim_km"
FROM "user"
LEFT JOIN "run"
 ON "user"."id" = "run"."userId"
LEFT JOIN "ride"
 ON "user"."id" = "ride"."userId"
LEFT JOIN "swim"
 ON "user"."id" = "swim"."userId"
GROUP BY "user"."id»
источник

М

Максим in pgsql – PostgreSQL
Yaroslav Schekin
Казалось бы, что-то вроде:
SELECT ... 
 FROM "первая с логами" AS a
WHERE NOT EXISTS (
      SELECT 1
        FROM "вторая с датой исключений" AS x
       WHERE a.дата >= x."дата начало" AND a.дата <= x."дата конец"
      )
опа, а запрос не исключает, возвращаются все строки
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Максим
опа, а запрос не исключает, возвращаются все строки
Ошиблись где-то, наверное (я ни Вашего запроса, ни структуры таблиц, ни данных не видел) — исправьте. ;)
источник

Y

Your friend in pgsql – PostgreSQL
Ребят, куда расти после знаний базы?
источник

М

Максим in pgsql – PostgreSQL
Yaroslav Schekin
Ошиблись где-то, наверное (я ни Вашего запроса, ни структуры таблиц, ни данных не видел) — исправьте. ;)
table logs:
id - serial
time - timestamp
user - varchar
action - varchar

table exceptions:
id - serial
start_at - timestamp
end_at - timestamp

тут ошибиться в двух соснах тяжело :)
источник

Y

Your friend in pgsql – PostgreSQL
Your friend
Ребят, куда расти после знаний базы?
где попробовать применить?
источник

М

Максим in pgsql – PostgreSQL
Yaroslav Schekin
Ошиблись где-то, наверное (я ни Вашего запроса, ни структуры таблиц, ни данных не видел) — исправьте. ;)
но вы правы, ошибся :))
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Your friend
где попробовать применить?
Эээ... на практике? ;)
И что Вы имеете в виду под "знаниями базы" (я вообще не совсем понял вопрос)?
источник

АА

Андрей Агеев... in pgsql – PostgreSQL
Artem Nemtsev
Всем привет. Есть таблица Users в отношении с другими таблицами (Run, Ride, Swim, etc)
Стоит задача одним запросом вытащить всех Users и к каждому юзеру прикрепить сумму километров из таблиц с отношениями
Но запрос ниже не работает со всеми вместе, ибо с каждым джоином повторяющихся данных все больше и больше
Как можно решить эту проблему?
SELECT
 "user"."id",
 "user"."name",
 SUM("run"."km") AS "run_km",
 SUM("ride"."km") AS "ride_km",
 SUM("swim"."km") AS "swim_km"
FROM "user"
LEFT JOIN "run"
 ON "user"."id" = "run"."userId"
LEFT JOIN "ride"
 ON "user"."id" = "ride"."userId"
LEFT JOIN "swim"
 ON "user"."id" = "swim"."userId"
GROUP BY "user"."id»
SELECT
 "user"."id",
 "user"."name",
 "sum_run"."km" AS "run_km"
FROM "user"
LEFT JOIN (select "run"."userId",
   sum("run"."km") AS "km" from "run"
   group by "run"."userId"
) AS "sum_run"
ON "user"."id" = "sum_run"."userId"

с другими таблицами аналогично поступить
источник

Y

Your friend in pgsql – PostgreSQL
Yaroslav Schekin
Эээ... на практике? ;)
И что Вы имеете в виду под "знаниями базы" (я вообще не совсем понял вопрос)?
Да, на практике. Насчет знаний базы имел в виду SQL - селекты, индексы и т д
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Artem Nemtsev
Всем привет. Есть таблица Users в отношении с другими таблицами (Run, Ride, Swim, etc)
Стоит задача одним запросом вытащить всех Users и к каждому юзеру прикрепить сумму километров из таблиц с отношениями
Но запрос ниже не работает со всеми вместе, ибо с каждым джоином повторяющихся данных все больше и больше
Как можно решить эту проблему?
SELECT
 "user"."id",
 "user"."name",
 SUM("run"."km") AS "run_km",
 SUM("ride"."km") AS "ride_km",
 SUM("swim"."km") AS "swim_km"
FROM "user"
LEFT JOIN "run"
 ON "user"."id" = "run"."userId"
LEFT JOIN "ride"
 ON "user"."id" = "ride"."userId"
LEFT JOIN "swim"
 ON "user"."id" = "swim"."userId"
GROUP BY "user"."id»
Или же использовать "каскад" группировок:
WITH user_runs AS (
SELECT "user".id, "user".name, SUM(run.km) AS run_km
 FROM "user"
 LEFT JOIN run
   ON "user".id = run.userId
GROUP BY "user".id
), user_runs_rides AS (
SELECT user_runs.id, user_runs.name, user_runs.run_km, SUM(ride.km) AS ride_km
 FROM user_runs
 LEFT JOIN ride
   ON ride.userId = user_runs.id
GROUP BY user_runs.id, user_runs.name, user_runs.run_km
), ...


Или просто подзапросы:
SELECT "user".id, "user".name,
      (SELECT SUM(run.km) FROM run WHERE run.userId = "user".id) AS run_km,
      (SELECT SUM(ride.km) FROM ride WHERE ride.userId = "user".id) AS ride_km,
      ...
 FROM "user"
источник

AN

Artem Nemtsev in pgsql – PostgreSQL
@andrey_ageev Yaroslav спасибо огромное
А какой из этих запросов будет более правильным? Подзапросы?
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Artem Nemtsev
@andrey_ageev Yaroslav спасибо огромное
А какой из этих запросов будет более правильным? Подзапросы?
В смысле "правильным"? Если правильно напишете, то результат любого из подходов должен быть одинаковым.
А дальше берите тот, который понятнее / нагляднее, IMHO.
источник

АА

Андрей Агеев... in pgsql – PostgreSQL
Artem Nemtsev
@andrey_ageev Yaroslav спасибо огромное
А какой из этих запросов будет более правильным? Подзапросы?
если смотреть в будущее - например вам кроме километров понадобится еще количество поездок, то соединение удобнее, а если нужно всего одно поле, то подзапросов достаточно
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Your friend
где попробовать применить?
Хмм... в работе, например (я в самом деле не понимаю, о чём вопрос, извините)?
источник

МИ

Максим Исаев... in pgsql – PostgreSQL
Все привет! подскажите как запихать первый client.id во все строки по такому запросу https://pastebin.com/vgDVXrKZ
источник

М

Максим in pgsql – PostgreSQL
SELECT *,
    (SELECT primary_id from ….  where … order by …. limit 1) as primary_id
from ….
where
order by


на скору руку можно и так)
источник