powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите с запросом
22 сообщений из 22, страница 1 из 1
Помогите с запросом
    #39756625
olegsng
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер, коллеги
прошу помощи в создании запроса. Много лет, как уже отошел от программирования, да и не был сильно силен в сложных запросах, а тут пришлось решать задачку и вспоминать SQL.

Так вот, исходные данные - это события такого вида

время начала, время окончания, поле 1, поле 2, поле 3 и т.д.

Нужно

1. Сгруппировать события по времени окончания, выяснив сколько таких событий пришлось на конкретное время окончания

это я сделал так

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT CLOSE_COUNT AS NO_STEP, COUNT(CLOSE_COUNT) AS STEP_COUNT
FROM(
 SELECT top.OPERATION_CLOSE_TIME, COUNT(top.OPERATION_CLOSE_TIME) AS CLOSE_COUNT
 FROM TESTER_OPERATIONS top
 WHERE (top.TEST_ID = 123)
 GROUP BY  top.OPERATION_CLOSE_TIME)
GROUP BY 1



итог отработки такой, например
Код: plaintext
1.
2.
3.
NO_STEP  STEP_COUNT
1        100
2        50
3        20, 

т.е. одиночных оконченных событий было 100, вариантов, когда 2 события закончились одновременно было 50 и т.д.

А вот дальше мыслей нет

2. Теперь нужно добавить колонки для событий, по полю 1, т.е., всего одиночных событий было 100, из них со
значением поля 1 = 0 было 60 и созначением поля 1 = было 40, т.е. таблица результата должна быть такая

Код: plaintext
1.
2.
3.
NO_STEP  STEP_COUNT POLE1=0 POLE1=1
1        100        60      40 
2        50         0       50              
3        20         9       11 

STEP_COUNT = POLE1=0 + POLE1=1

(значений поля 1 - ограниченное кол-во и они являются константами - по факту это 2 значения)

3. Теперь нужно добавить колонку с суммой по полю 2 для всех событий и раздельно для событий со значениями поля 1 = 0 и 1,
т.е. одиночных событий всего было 100 и сумма поля 2 для всех событий - SUMM_ALL,
одиночных событий полем с 1 = 0 было 60 и сумма поля 2 для этих 60 событий - SUMM_0,
одиночных событий полем с 1 = 1 было 40 и сумма поля 2 для этих 40 событий - SUMM_1,

Код: plaintext
1.
2.
3.
NO_STEP  STEP_COUNT POLE1=0 POLE1=1 SUMM_ALL SUMM_0 SUMM_1
1        100        60       40       3,14   2,0    1,14
2        50         0        50       9,16   1,16   8,0    
3        20         9        11       8,25   5,0    3,25 

(SUMM_ALL=SUMM_0+SUMM_1)

3. Теперь нужно добавить 3 колонки с максимальной разнцей по времени
начала и конца по группе событий. Для одиночных событий, понятно это
время окончания - время начала, поэтому расмотрим группу событий, допустим из 3 шт


время1, время6, поле 1=0, поле 2=3.12, и т.д.
время2, время6, поле 1=0, поле 2=3.15, и т.д.
время4, время6, поле 1=0, поле 2=3.16, и т.д.

время3, время8, поле 1=1, поле 2=3.17, и т.д.
время5, время8, поле 1=1, поле 2=3.18, и т.д.
время7, время8, поле 1=1, поле 2=3.19, и т.д.

(время1 < время2 < ..... < время8)


Для всех троек DIFF_ALL = время8-время1, для троек с полем1=0 DIFF_0 = время6-время1,
для троек с полем1=1 DIFF_0 = время8-время3


Код: plaintext
1.
NO_STEP  STEP_COUNT POLE1=0 POLE1=1 SUMM_ALL SUMM_0 SUMM_1   DIFF_ALL DIFF_0  DIFF_1
3        20         9        11     18,97    9,43   9,54     5:15     2:35    6:18                                    


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


Спасибо.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39756647
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
olegsng,

смотри COALESCE
...
Рейтинг: 0 / 0
Помогите с запросом
    #39758456
olegsng
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, коллеги

ну так как элегантного решения не нашлось пришлось как обычно делать с помощью костыля и селективной процедуры. Пришлось добавить доп поле к записи - STEP_ID и после сброса данных в таблицу вызвать такую процедуру

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE OR ALTER PROCEDURE SET_STEP_ID (
    TEST_ID TYPE OF COLUMN TESTER_OPERATIONS.TEST_ID)
AS
 DECLARE VARIABLE CLOSE_TIME TYPE OF COLUMN TESTER_OPERATIONS.OPERATION_CLOSE_TIME;
 DECLARE VARIABLE STEP_ID TYPE OF COLUMN TESTER_OPERATIONS.STEP_ID;
BEGIN
 /* Procedure Text */
 /* v 1.0 08.01.2019 */
 FOR  SELECT DISTINCT top.OPERATION_CLOSE_TIME,  COUNT(top.OPERATION_CLOSE_TIME)
 FROM TESTER_OPERATIONS top
 WHERE (top.TEST_ID = :TEST_ID)
 GROUP BY  top.OPERATION_CLOSE_TIME

 INTO :CLOSE_TIME, :STEP_ID DO BEGIN

  UPDATE TESTER_OPERATIONS top
  SET    top.STEP_ID = :STEP_ID
  WHERE  (top.OPERATION_CLOSE_TIME = :CLOSE_TIME) AND (top.TEST_ID = :TEST_ID);

 END
END




Далее уже все просто, селективная процедура вида

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 FOR SELECT DISTINCT top.STEP_ID
 FROM TESTER_OPERATIONS top
 WHERE top.TEST_ID = :TEST_ID
 INTO :STEP_ID DO BEGIN

  --STEP_ID = 10;

  COUNT_B_G = 0;

  SELECT CLOSE_COUNT AS GRID_STEP, COALESCE(COUNT(CLOSE_COUNT), 0) AS ALL_G_COUNT
  FROM (
        SELECT top.OPERATION_CLOSE_TIME_STR, COUNT(top.OPERATION_CLOSE_TIME_STR) AS CLOSE_COUNT
        FROM TESTER_OPERATIONS top
        WHERE (top.TEST_ID = :TEST_ID) and (top.STEP_ID = :STEP_ID) AND (top.OPERATION_SUBTYPE_ID = 1)
        GROUP BY  top.OPERATION_CLOSE_TIME_STR)
  GROUP BY 1
  INTO :STEP_ID, :COUNT_B_G;
  ........

  SUSPEND;
 END;



К слову сказать, первоначальная идея с одним оператором SELECT на выборку всех необходимых данных, наверное, не сработала бы - из таблицы доставалась достаточно сложная статистика и одним запросом все сделать было бы проблематично. А так по кусочкам слепил то, что нужно.

Хочу еще сказать за не очевидное поведение (на мой взгляд) оператора SELECT - может это и баян и все об этом знают - но я в обсуждениях не встречал. Да, сервер 2.5, хотя это же было и ранее на 1.0, 1.5.х

Так вот, если оператор SELECT не находит данные но условию, то в переменной остается предыдущее значение, а не NULL, как это стоило бы ожидать.

Код: sql
1.
2.
3.
4.
  COUNT_B_G = 0;
  SELECT CLOSE_COUNT AS GRID_STEP, COALESCE(COUNT(CLOSE_COUNT), 0) AS ALL_G_COUNT
  ........
  INTO :STEP_ID, :COUNT_B_G;



Если этот участок кода делается в цикле и на предыдущей итерации COUNT_B_G, допустим, = 5, и, если очередной SELECT не нашел данных по условию, то в COUNT_B_G останется 5, а не новое значение NULL. Поэтому я эту переменную перед циклом обнуляю (ну или зануляю по потребности).

И уже, коль я выперся на форум, кто то скажет за Ded-а ? - как он, что с ним - в свое время его феномен здорово помог, думаю, что не только мне.


За сим позвольте откланяться.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39758508
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
olegsngТак вот, если оператор SELECT не находит данные но условию, то в переменной остается предыдущее значение, а не NULL, как это стоило бы ожидать.
Не стоило такого ожидать
Поищи, здесь на форуме были стоны ожидающих такого поведения
olegsngИ уже, коль я выперся на форум, кто то скажет за Ded-а ?
Появляется изредка , под новым ником "Старый плюшевый мишка "
...
Рейтинг: 0 / 0
Помогите с запросом
    #39758583
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
olegsng
за Ded-а ? - как он, что с ним - в свое время его феномен здорово помог, думаю, что не только мне.
Чего-чего его помог??))
...
Рейтинг: 0 / 0
Помогите с запросом
    #39758592
olegsng
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vlad Folegsngза Ded-а ? - как он, что с ним - в свое время его феномен здорово помог, думаю, что не только мне.
Чего-чего его помог??))

Ded - сам есть живой феномен - его подробные разжевывания, подсказки, пинки и тычки помнятся через много лет, у меня до сих пор на компе лежат выписки из его постов - правда тогда это было на другом ресурсе (лет 10-15 назад).

ПС - а Вы что подумали?
...
Рейтинг: 0 / 0
Помогите с запросом
    #39758599
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
olegsng,

За Деда мне рассказывать не надо. В т.ч. и в доскрулевскую эпоху. Просто сама формулировка позабавила.
Ладно, посмотрим, что он сам скажет, когда проснется. И не вспомнит ли известный анекдот, когда поциент
пришел с ним к доктору.))
...
Рейтинг: 0 / 0
Помогите с запросом
    #39758682
Tactical Nuclear Penguin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ded - это же с epsylon.public.interbase ?
сколько лет! :)
...
Рейтинг: 0 / 0
Помогите с запросом
    #39758766
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tactical Nuclear Penguin> сколько лет! :)

Гм... Ты вроде старожил тут (если я правильно узнал твой пред. ник)...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите с запросом
    #39758803
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot olegsng
И уже, коль я выперся на форум, кто то скажет за Ded-а ? - как он, что с ним[/quot]

Вышел на пенсию, растолстел, отупел, обленился, ни ногами, ни извилинами почти не шевелит, практически не пьёт, разве что таблетки, сидит с клюкой на лавочке у подъезда и бубнит - в наше время в булошную на такси не ездили! В общем, превратился в пренеприятнейшего старикашку.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39758814
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишка,

Но феномен то свой сохранил в энергичном, надеюсь, состоянии??
...
Рейтинг: 0 / 0
Помогите с запросом
    #39758830
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad FСтарый плюшевый мишка,

Но феномен то свой сохранил в энергичном, надеюсь, состоянии??

В работоспособном, в принципе. Но предпочитает групповуху - просачковать можно.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39758851
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый,

Снимаю шляпу, Дед, снимаю шляпу.))
...
Рейтинг: 0 / 0
Помогите с запросом
    #39758893
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишка> сидит с клюкой на лавочке у подъезда и бубнит

Ты же вроде говорил, что игрушки кампутерные играешь ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите с запросом
    #39758976
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамСтарый плюшевый мишка> сидит с клюкой на лавочке у подъезда и бубнит

Ты же вроде говорил, что игрушки кампутерные играешь ?


Ну не круглые же сутки :)
...
Рейтинг: 0 / 0
Помогите с запросом
    #39759042
Tactical Nuclear Penguin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамTactical Nuclear Penguin> сколько лет! :)

Гм... Ты вроде старожил тут (если я правильно узнал твой пред. ник)...


есть ник 2001 года...
просто не думал что Ded тут :)
...
Рейтинг: 0 / 0
Помогите с запросом
    #39759051
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый,

Ну а почему именно "у подъезда", а не в излюбленном месте зимовки россейских медведей на пенсии на даче?
Ведь это все таки, как понимаю, прибалтика, а не, к примеру, заскорузлые сталинградские степи?))
...
Рейтинг: 0 / 0
Помогите с запросом
    #39759068
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad FСтарый,

Ну а почему именно "у подъезда", а не в излюбленном месте зимовки россейских медведей на пенсии на даче?
Ведь это все таки, как понимаю, прибалтика, а не, к примеру, заскорузлые сталинградские степи?))

Хоспиди, ну какие вы с Рустамом прямолинейные :)) Я ж в душе художник, автопортрет рисую, в жанре импрессионизьму, а не отчёт в прокуратуру пишу
...
Рейтинг: 0 / 0
Помогите с запросом
    #39759076
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tactical Nuclear PenguinГаджимурадов РустамTactical Nuclear Penguin> сколько лет! :)

Гм... Ты вроде старожил тут (если я правильно узнал твой пред. ник)...


есть ник 2001 года...
просто не думал что Ded тут :)

Да нет того Деда, нет. Не здесь, а вообще. Есть старый и больной пердун Заглядывает сюда знакомые голоса послушать, а не учить и воевать за правду-матку. Он её нынешнюю не особо понимает.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39759109
olegsng
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vlad FСтарый,

Ведь это все таки, как понимаю, прибалтика, а не, к примеру, заскорузлые сталинградские степи?))

Не понял, кто там на мои сталинградские степи крошит булочку?

Старый плюшевый мишка
Вышел на пенсию ........ практически не пьёт

И даже курвуазье ??????

Если серьезно, то ----> Мишка, спасибо тебе огромное, за то что был и за то что есть. Только с годами понимаешь, что у тебя было и что ты потерял. Самые теплые воспоминания о том топике. Конспекты - храню, ну вот, например

------------------------------

Subject: Re: GROUP BY EXTRACT( YEAR FROM DATE_OF_PAYMENT )
Date: Wed, 08 Oct 2003 13:30:19 +0400
From: Ded <ded@hq.bereg.net>;
Newsgroups: epsylon.public.interbase

Dmitry Yemanov wrote:
> > FB1.0. Там тоже можно групировать по многим полям, но в данном случае
> > поле -
> > это функция EXTRACT( YEAR FROM P.DATE_OF_PAYMENT ) от поля.
> > Как в group затащить поле-"функцию от поля"?
>
> В FB 1.0 - никак. Только написав свою UDF, которая выполняет те же действия,
> что и EXTRACT, и продублировав в GROUP BY полный код вызова этой UDF.

Приветики. Ну так уж и никак. По встроенной функции оно действительно
группировать не умеет, но можно вызвать её внутри любой существующей
UDF, не искажающей результата. В данном случае я давно пользую

SELECT P.CLIENT_NUMB,
Abs(EXTRACT( YEAR FROM P.DATE_OF_PAYMENT )) Y,
Abs(EXTRACT( month FROM P.DATE_OF_PAYMENT )) M,
SUM( PAYMENT.SUM_OF_PAYMENT)
FROM PAYMENT P
GROUP BY P.CLIENT_NUMB,
Abs(EXTRACT( YEAR FROM P.DATE_OF_PAYMENT )),
Abs(EXTRACT( month FROM P.DATE_OF_PAYMENT )),

Regards. Ded.

------------------------------

Subject: Re: UDF,Delphi,Round,и я ...
Date: Tue, 27 Aug 2002 15:30:59 +0400
From: Ded <ded@hq.bereg.net>;
Newsgroups: epsylon.public.interbase

Dmitry Lendel wrote:
> Вопрос больше по Delphi.

Привет. Ошибаисси :)

> Начал проверять и заметил
>
> Round(1.5) возвращает 2
> Round(40162.5) возвращает 40162
>
> Я чему-то не доучился?

Команде FISTP Intel-процессора. Реализующей так назваемое банковское
округление, а не то, которому нас учили в школе. Я сейчас точно не помню
что там должно быть чётным/нечётным чтобы решать куда округлять 0.5, но
вместо него пользую

function kround(d:Double):LongInt;
begin
if d >=0 then Result:=Trunc(d+0.5000001)
else Result:=Trunc(d-0.5000001);
end;

Regards. Ded.

------------------------------

Короче, у меня все ходы записаны.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39759120
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
olegsng,

Спасибо. Приятно, чорт возьми :)
...
Рейтинг: 0 / 0
Помогите с запросом
    #39759544
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СтарыйХоспиди, ну какие вы прямолинейные :)) Я ж в душе художник, автопортрет рисую, в жанре импрессионизьму, а не отчёт в прокуратуру пишу
Сейчас мне кажется, однако,
Что Дед нас просто всех надул.))
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите с запросом
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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