powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Условие выборки
16 сообщений из 16, страница 1 из 1
Условие выборки
    #39295894
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Таблица "oper" содержит такие данные:
Код: plaintext
1.
2.
3.
4.
5.
6.
id  id_m  dt          <прочие поля>
3    2    11.07.2016
4    3    12.07.2016
1    2    01.05.2016
2    3    02.05.2016
5    4    01.07.2016
Подскажите, пож., условие в селективном запросе чтобы
в выборке были уникальные значения из поля id_m и только самые "свежие" записи.
Т.е. исходя из примера результат должен быть таким:

Код: plaintext
1.
2.
3.
4.
id  id_m  dt         <прочие поля>
3    2    11.07.2016
4    3    12.07.2016
5    4    01.07.2016
...
Рейтинг: 0 / 0
Условие выборки
    #39295904
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Свежесть записей определяется по dt или можно считать бОльший ID достаточным признаком свежести?
Сколько этих "прочих полей".
...
Рейтинг: 0 / 0
Условие выборки
    #39295909
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks, "свежесть" по дате. Полей всего 10
...
Рейтинг: 0 / 0
Условие выборки
    #39295914
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08fraks, "свежесть" по дате.

А если даты совпали?
...
Рейтинг: 0 / 0
Условие выборки
    #39295916
igs123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SAN_01_08,
А на одну и ту же дату точно нет нескольких записей (id)?
...
Рейтинг: 0 / 0
Условие выборки
    #39295934
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такой вариант:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create table oper (
id   integer not null primary key,
id_m integer,
dt   date,
f1   integer,
f2   integer,
f3   integer
);


insert into oper(id, id_m, dt, f1, f2, f3) values(3, 2, '11.07.2016', 31, 32, 33);
insert into oper(id, id_m, dt, f1, f2, f3) values(4, 3, '12.07.2016', 41, 42, 43);
insert into oper(id, id_m, dt, f1, f2, f3) values(1, 2, '01.05.2016', 11, 12, 13);
insert into oper(id, id_m, dt, f1, f2, f3) values(2, 3, '02.05.2016', 21, 22, 23);
insert into oper(id, id_m, dt, f1, f2, f3) values(5, 4, '01.07.2016', 51, 52, 53);
commit;



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
execute block
returns (
  id   integer,
  id_m integer,
  dt   date,
  f1   integer,
  f2   integer,
  f3   integer
)
as
begin
  for select id_m, max(dt)
    from oper
    group by id_m
    into :id_m, :dt
    do begin
         select first 1
           id,  f1, f2, f3
         from oper
         where (oper.id_m = :id_m) and (oper.dt = :dt)
         order by id desc -- если с одной датой встретится несколько записей, возьмем с максимальным ID
         into :id,  :f1, :f2, :f3;
         --
         suspend;
       end
end;
...
Рейтинг: 0 / 0
Условие выборки
    #39296178
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благодарю, fraks . Этот вариант хорош и работает.
Правда, не хотелось бы block - нужно параметр передавать.
Видимо, ХП придется делать по этому примеру.

P.S. двух записей с одинаковой парой значений id_m и dt быть не может принципиально,
поэтому и без first 1 (rows 1) скрипт отрабатывает нормально.
...
Рейтинг: 0 / 0
Условие выборки
    #39296185
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08,

В блок тоже можно передавать параметры.
...
Рейтинг: 0 / 0
Условие выборки
    #39296186
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster, что можно - знаю, как передавать - не знаю. В руководстве как-то не очень внятно объяснено.
...
Рейтинг: 0 / 0
Условие выборки
    #39296196
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08,

версия FB какая?
...
Рейтинг: 0 / 0
Условие выборки
    #39296202
dedRasta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SAN_01_08DarkMaster, что можно - знаю, как передавать - не знаю. В руководстве как-то не очень внятно объяснено.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
execute block 
(
    GOD integer = :GOD,
    KWARTAL integer = :KWARTAL
)
returns (
    FIO varchar(130),
    JOBNAME varchar(130)
)
as
begin
...

end


...
Рейтинг: 0 / 0
Условие выборки
    #39296212
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08, попробуй вот так
Код: sql
1.
2.
3.
4.
5.
6.
select b.id, t.f1, t.f2
from ( select a.id_m, max(a.dt)
       from oper a
       group by 1
     ) t (f1, f2)
     inner join oper b on b.id_m=t.f1 and b.dt=t.f2


Только анализ производительности посмотри, может нужно индексов каких добавить.
...
Рейтинг: 0 / 0
Условие выборки
    #39296283
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, виноват, забыл сказать. версия 2.5
...
Рейтинг: 0 / 0
Условие выборки
    #39296323
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI, Спасибо. Интересный вариант.
Не до конца осознал, но работает как надо.
Мне главное вытащить нужные id (через CTE, допустим) , а дальше мясо в виде нужных значений нарастить не сложно.
С производительностью разберусь - предупрежден.
...
Рейтинг: 0 / 0
Условие выборки
    #39296335
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08, Читай в Руководстве "Выборка из производной таблицы". И, как выяснилось, если есть нужда получать max по дате, то нужно делать индекс по дате с сортировкой "по убыванию".
...
Рейтинг: 0 / 0
Условие выборки
    #39296376
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIИ, как выяснилось, если есть нужда получать max по дате, то нужно делать индекс по дате с сортировкой "по убыванию".Ок. Учту.
Благодарю всех и за все. Запрос получился в полном объеме как нужно.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Условие выборки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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