powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Нужна помощь с запросом
20 сообщений из 20, страница 1 из 1
Нужна помощь с запросом
    #39000866
evil_admin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужна помощь с запросом
Есть таблица "Users" в ней есть колонки
"Data" формат timestamp without time zone
"State" формат integer (1- не на работе, 2- на рабочем месте 3 - выполняет задание)
"IDUser" формат bigint

Мне нужно получить список пользователей, которые с 5 утра до 7 утра получили статус 2 (вышли на работу) но перед тем как его получить у них был статус 1 (отдыхали) дабы отсеять тех кто работал в ночь и перешел из статуса 3 по окончании своего задания. Как то так.
Меня хватило только на этот запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT 
  "Users"."IDUser" AS "IDUser", 
  min("Users"."Date")
  FROM 
  public."Users"
WHERE 
  "Users"."State" = 2 AND 
  "Users"."Date" BETWEEN now()::date + time '05:00:00' and now()::date + time '07:00:00'
GROUP BY
  "Users"."IDUser"
...
Рейтинг: 0 / 0
Нужна помощь с запросом
    #39000875
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
evil_admin,

Предоставьте примерные данные (в форме INSERT-ов или генерирующего SELECT-а), а также ожидаемый результат для этих данных.
...
Рейтинг: 0 / 0
Нужна помощь с запросом
    #39000891
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
evil_adminно перед тем как его получить у них был статус 1 (отдыхали) дабы отсеять тех кто работал в ночьперед - скользкий критерий. длительность, интервал с-по.
...
Рейтинг: 0 / 0
Нужна помощь с запросом
    #39001005
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
evil_admin,

в таблице "Users", я так понимаю, хранятся точки смены состояния работника?
соответственно, состояние действует с момента своего начала до момента следующего состояния (сортировка в разрезе работника по полю с датой).

Если так, то можно смотреть в сторону оконных функций LEAD/LAG для получения "следующего"/"предыдущего" статуса.
...
Рейтинг: 0 / 0
Нужна помощь с запросом
    #39001054
evil_admin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть User 001 который 05-07-2015 17:00:00:000 ушел на выходные в таблице в это время поставилось для него состояние 1
а 07-07-2015 05:01:00:000 вышел на работу (в это время прописалось состояние 2)
Есть второй User 002 который закончил работу 06-07-2015 15:00:00:000 (получил статус 1) и вышел 07-07-2015 06:30:00:000 (получил состояние 2)
И есть третий User 003 который закончил работу 05-07-2015 19:00:00:000 (перешел в состояние 1) и вышел на работу 07-07-2015 01:00:00:000 (получил состояние 2)
и все это время выполнял задания 07-07-2015 01:10:00:000 взял задание и приступил к работе (получил статус 3), а через 30 минут его закончил 07-07-2015 01:40:00:000 (опять получил состояние 2) и так в течении ночи и 07-07-2015 04:59:00:000 опять взял задание
которое закончил 07-07-2015 05:45:00:000 и продолжает работать.
Если сделать выборку в интервале времени по состоянию 2 то все они с 5 до 7 утра имели состояние 2, но User 003 мне не нужен т.к. он выполнял работал в ночь, а User 001 и 002 только вышли на работу вот они меня и интересуют.

Таблица с данными
UserStateDate001105-07-2015 17:00:00:000003105-07-2015 19:00:00:000002106-07-2015 15:00:00:000003207-07-2015 01:00:00:000003307-07-2015 01:10:00:000003207-07-2015 01:40:00:000...............................003307-07-2015 04:59:00:000001207-07-2015 05:01:00:000001207-07-2015 05:01:01:000003207-07-2015 05:45:00:000002207-07-2015 06:30:00:000
Бывают такие моменты когда состояние 2 может поставится 2 или 3и раза с разницей в секунду (Web интерфейс)
Результат должен быть
User001002
...
Рейтинг: 0 / 0
Нужна помощь с запросом
    #39001150
evil_admin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел выход с помощью EXCEPT
...
Рейтинг: 0 / 0
Нужна помощь с запросом
    #39001922
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
evil_admin,

нашел - показывай... :)
...
Рейтинг: 0 / 0
Нужна помощь с запросом
    #39001967
evil_admin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
((SELECT 
  "Users"."IDUser" AS "IDUser"
FROM 
   public."Users"
WHERE 
  "Users"."State" = 2 AND 
  "Users"."Date" BETWEEN now()::date + time '05:00:00' and now()::date + time '07:00:00'
GROUP BY
  "Users"."IDUser")
   EXCEPT
      (SELECT 
         "Users"."IDUser" AS "IDUser"
      FROM 
         public."Users"
      WHERE 
        "Users"."State" = 2 AND 
        "Users"."Date" BETWEEN now()::date + time '00:00:01' and now()::date + time  '04:59:59'
     GROUP BY
        "Users"."IDUser"))
...
Рейтинг: 0 / 0
Нужна помощь с запросом
    #39002160
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
evil_admin,

такой же результат можно получить с помощью having без повторного обращения к таблице.
...
Рейтинг: 0 / 0
Нужна помощь с запросом
    #39003018
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
evil_admin
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
((SELECT 
  "Users"."IDUser" AS "IDUser"
FROM 
   public."Users"
WHERE 
  "Users"."State" = 2 AND 
  "Users"."Date" BETWEEN now()::date + time '05:00:00' and now()::date + time '07:00:00'
GROUP BY
  "Users"."IDUser")
   EXCEPT
      (SELECT 
         "Users"."IDUser" AS "IDUser"
      FROM 
         public."Users"
      WHERE 
        "Users"."State" = 2 AND 
        "Users"."Date" BETWEEN now()::date + time '00:00:01' and now()::date + time  '04:59:59'
     GROUP BY
        "Users"."IDUser"))

Совершенно непонятно, какое место в Вашем запросе отвечает за проверку озвученного Вами же условия:
evil_adminМне нужно получить список пользователей, которые с 5 утра до 7 утра получили статус 2 (вышли на работу) но перед тем как его получить у них был статус 1 (отдыхали) дабы отсеять тех кто работал в ночь и перешел из статуса 3 по окончании своего задания. Как то так.
...
Рейтинг: 0 / 0
Нужна помощь с запросом
    #39003231
Kvasnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
WITH 
"State1" as (
  SELECT DISTINCT ON ("IDUser") "IDUser", "State"
  FROM public."Users"
  WHERE "Data" BETWEEN now()::date + time '00:00:00' AND now()::date + time '04:59:59'
  ORDER BY "IDUser", "Data" DESC 
)
SELECT * 
FROM "State1"
WHERE "Data" BETWEEN now()::date + time '05:00:00' AND now()::date + time '07:00:00'
  AND "IDUser" IN (SELECT "IDUser" FROM "State1" WHERE "State" = 1) 
...
Рейтинг: 0 / 0
Нужна помощь с запросом
    #39003784
evil_admin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kvasnikov
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
WITH 
"State1" as (
  SELECT DISTINCT ON ("IDUser") "IDUser", "State"
  FROM public."Users"
  WHERE "Data" BETWEEN now()::date + time '00:00:00' AND now()::date + time '04:59:59'
  ORDER BY "IDUser", "Data" DESC 
)
SELECT * 
FROM "State1"
WHERE "Data" BETWEEN now()::date + time '05:00:00' AND now()::date + time '07:00:00'
  AND "IDUser" IN (SELECT "IDUser" FROM "State1" WHERE "State" = 1) 



Спасибо то что надо.
Еще вопрос попутно, можно ли как нибудь объявить дату в переменную один раз (это надо для того что бы за предыдущие дни смотреть отчет и каждый раз не менять даты везде, где они встречаются)?
...
Рейтинг: 0 / 0
Нужна помощь с запросом
    #39003824
Kvasnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот этот вопрос самого интересует.
Дайте знать, если научитесь это делать ))
...
Рейтинг: 0 / 0
Нужна помощь с запросом
    #39003851
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kvasnikov,

молодые люди, вы конечно и дальше можете обмениваться любезностями

но
вот за это
Код: sql
1.
x BETWEEN now()::date + time '00:00:00' AND now()::date + time '04:59:59'


вместо
Код: sql
1.
x>=A AND x<B 

руки надо выдирать с корнем
из jопы


и да, по переменным/параметрам --
PREPARE /EXECUTE -- http://www.postgresql.org/docs/current/static/sql-prepare.html
или
CREATE FUNCTION -- http://www.postgresql.org/docs/current/static/sql-createfunction.html
...
Рейтинг: 0 / 0
Нужна помощь с запросом
    #39003912
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
evil_adminЕще вопрос попутно, можно ли как нибудь объявить дату в переменную один раз (это надо для того что бы за предыдущие дни смотреть отчет и каждый раз не менять даты везде, где они встречаются)?
Старайтесь думать реляциями, это же SQL.

Сформируйте таблицу при помощи `WITH` конструкции, потом присоединяйте ее к вашим данным:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
WITH params AS (
    SELECT 1 as param_a,
           15 as param_b,
           CURRENT_DATE as param_c
)
SELECT id,name,last_date
  FROM tab
  CROSS JOIN param
 WHERE last_date > param_c;
...
Рейтинг: 0 / 0
Нужна помощь с запросом
    #39004064
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
evil_admin
Kvasnikov
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
WITH 
"State1" as (
  SELECT DISTINCT ON ("IDUser") "IDUser", "State"
  FROM public."Users"
  WHERE "Data" BETWEEN now()::date + time '00:00:00' AND now()::date + time '04:59:59'
  ORDER BY "IDUser", "Data" DESC 
)
SELECT * 
FROM "State1"
WHERE "Data" BETWEEN now()::date + time '05:00:00' AND now()::date + time '07:00:00'
  AND "IDUser" IN (SELECT "IDUser" FROM "State1" WHERE "State" = 1) 



Спасибо то что надо.Вы уверены?
...
Рейтинг: 0 / 0
Нужна помощь с запросом
    #39004188
Kvasnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwqKvasnikov,


но
вот за это
Код: sql
1.
x BETWEEN now()::date + time '00:00:00' AND now()::date + time '04:59:59'


вместо
Код: sql
1.
x>=A AND x<B 

руки надо выдирать с корнем
из jопы


Qwwq, спасибо, что обратили на это внимание.
Но раз уж вы решили искоренять невежество, то, пожалуйста, объясните почему так не надо делать
...
Рейтинг: 0 / 0
Нужна помощь с запросом
    #39004199
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kvasnikov,

Ну для начала вы потеряли все записи между 04:59:59 и 05:00:00 :)

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Нужна помощь с запросом
    #39004202
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kvasnikov пожалуйста, объясните почему так не надо делать
по определению.


есть анекдот про старого еврея-- портного, сына и отрез сыну на брюки

вероятно время квантуется, но не такими порциями

хотя есть вариант типа timestamp[tz] , с точностью timestamp(0) когда отрез можно сделать и по-вашему. но на хера руку ломать ?

эту 1С-ную привычку надо искоренять, вместе с 1С -- конфигурастами и 1С вообще, как эталонной говноконторой.

судя по всему, если бы своевременно абортировали братцев не то нуралиевых не то нургалиевых -- дегенератов, которым надо бы было втирать про открытые, полуоткрытые, и закрытые интервалы в стране бы поуменьшилось. и идиотских вопросов после явного указания правильного кейса никто бы не задавал
...
Рейтинг: 0 / 0
Нужна помощь с запросом
    #39004349
evil_admin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина АннаВы уверены?

Я понимаю, нет предела совершенству, но в данный момент отчет выполняется быстро и корректно (разумеется я немного его исправил). Если знаете как сделать все по фэншую, будьте добры покажите.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Нужна помощь с запросом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]