Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Поиск записей с самыми последними датами / 18 сообщений из 18, страница 1 из 1
25.04.2016, 16:43
    #39224033
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск записей с самыми последними датами
Привет всем!
Для профессионалов это слишком легкая задача!
Итак задана таблица:
Дата Элемент ЗначенияЭлемента 01.01.2016 X 15 01.02.2016 X 8 01.02.2016 Y 35 01.03.2016 X 5 01.03.2016 Y 6 01.04.2016 X 9 01.02.2016 Z 2

Необходимо вывести состояния Элементов на дату 01.03.2016
Результат будет:
Дата Элемент ЗначенияЭлемента 01.03.2016 X 5 01.03.2016 Y 6 01.02.2016 Z 2

Как будет оптимальный sql запрос по данному задачу?
...
Рейтинг: 0 / 0
25.04.2016, 16:50
    #39224039
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск записей с самыми последними датами
AlimkulovДля профессионалов это слишком легкая задача!
Такой вывод может сделать только профессионал!

Значит?
...
Рейтинг: 0 / 0
25.04.2016, 18:15
    #39224109
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск записей с самыми последними датами
Мой вариант:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with temp_table as (
      select Элемент, max(Дата) as Д
      from Table1
      group by 1
      having max(Дата) <= '01.03.2016')
select t.Дата, t.Элемент, t1.ЗначенияЭлемента
from temp_table t
left outer join Table1 t1 on (
       (t.Элемент = t1.Элемент) and 
       (t.Д = t1.Дата)
...
Рейтинг: 0 / 0
25.04.2016, 18:18
    #39224111
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск записей с самыми последними датами
PLAN JOIN (SORT (t Table1 NATURAL), t1 NATURAL)
...
Рейтинг: 0 / 0
26.04.2016, 04:48
    #39224316
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск записей с самыми последними датами
Alimkulov,

ИМХО постановка задачи неполна.

Нет описания таблицы.
Судя по приведенному плану не нравится два натурала, но ничего про какие-либо индексы в постановке задачи не известно.
Еще неплохо бы знать размер этой таблицы.
Если индексов таки нет и натурал неизбежен, можно например отсортировать таблицу по "Элемент+Дата desc", выбрать с ограничением сверху по интересующей дате и в процедуре бежать по данным следя за тем когда изменяется "Элемент", в нужный момент выдавая значения по suspend;
Но если таблица больша и есть индексы то вероятно нужен другой подход.
...
Рейтинг: 0 / 0
26.04.2016, 05:19
    #39224319
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск записей с самыми последними датами
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create table TTT(
  data  date,
  item  varchar(10),
  val   integer
);

insert into TTT(data, item , val) values('01.01.2016', 'X', 15);
insert into TTT(data, item , val) values('01.02.2016', 'X', 8);
insert into TTT(data, item , val) values('01.02.2016', 'Y', 35);
insert into TTT(data, item , val) values('01.03.2016', 'X', 5);
insert into TTT(data, item , val) values('01.03.2016', 'Y', 6);
insert into TTT(data, item , val) values('01.04.2016', 'X', 9);
insert into TTT(data, item , val) values('01.02.2016', 'Z', 2);



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
execute block
returns (
  data date,
  item varchar(10),
  val  integer
)
as
declare variable vitem varchar(10);
begin
  vitem = '';
  item  = '';
  for select data,  item , val
    from TTT
    where (data <= '01.03.2016')
    order by item, data desc
    into :data, :vitem, :val
    do begin
      if (:vitem <> :item) then begin
        item = vitem;
        suspend;
      end -- if
    end -- for
end;



PLAN SORT ((TTT NATURAL))

Тут уже план лучше.
...
Рейтинг: 0 / 0
26.04.2016, 06:19
    #39224329
Bit_Man
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск записей с самыми последними датами
Необходимо вывести ПОСЛЕДНЕЕ состояния Элементов на дату 01.03.2016
В таблице нужен уникальный индекс по "Дата" и "Элемент"
Код: plsql
1.
2.
3.
4.
select max("Дата"), "Элемент", max("ЗначениеЭлемента")
from MyTable
where "Дата" <= '01.03.2016'
group by "Элемент"
...
Рейтинг: 0 / 0
26.04.2016, 06:25
    #39224330
Ни фига.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск записей с самыми последними датами
Bit_ManНеобходимо вывести ПОСЛЕДНЕЕ состояния Элементов на дату 01.03.2016
В таблице нужен уникальный индекс по "Дата" и "Элемент"
Код: plsql
1.
2.
3.
4.
select max("Дата"), "Элемент", max("ЗначениеЭлемента")
from MyTable
where "Дата" <= '01.03.2016'
group by "Элемент"


запрос не вернет необходимое ТС-у
...
Рейтинг: 0 / 0
26.04.2016, 06:43
    #39224335
Bit_Man
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск записей с самыми последними датами
Ни фига.запрос не вернет необходимое ТС-у
Уверен? Только что проверил на этих данных. Выдает что нужный результат
...
Рейтинг: 0 / 0
26.04.2016, 06:46
    #39224337
Bit_Man
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск записей с самыми последними датами
Sorry, смотрю на дату, а на значение внимание не обращаю
...
Рейтинг: 0 / 0
26.04.2016, 06:49
    #39224338
Bit_Man
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск записей с самыми последними датами
Bit_ManSorry, смотрю на дату, а на значение внимание не обращаю
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with TempTable as
(
    select max(data) as data, item
    from TTT
    where data <= :data
    group by item
)

select TTT.*
from TempTable
    left join TTT on TTT.data = TempTable.data
        and TTT.item = TempTable.item


Должно работать
...
Рейтинг: 0 / 0
26.04.2016, 07:32
    #39224352
_однако_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск записей с самыми последними датами
Bit_Man,
по ходу, план будет как у ТС-а(не проверял, нет компа с FB под рукой), а его это вроде не устраивает
...
Рейтинг: 0 / 0
26.04.2016, 08:58
    #39224392
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск записей с самыми последними датами
Код: sql
1.
2.
3.
4.
5.
6.
select * from (
	select row_number() over (partition by t.item order by t.data desc) as RowID, t.*
	from TTT t
    where t.data <= :data
) t
WHERE t.RowID = 1
...
Рейтинг: 0 / 0
26.04.2016, 09:49
    #39224429
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск записей с самыми последними датами
__Avenger__,
row_number() в каком версии FB?
...
Рейтинг: 0 / 0
26.04.2016, 09:56
    #39224433
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск записей с самыми последними датами
fraks,
Размер таблицы пока неизвестна. Могут быт 1 тыс. или 500 тыс. строк.
Естественно индекс на "Дата" и "Элемент".
Что скажите, допустим индексы есть и 500 тыс. строк.
...
Рейтинг: 0 / 0
26.04.2016, 10:08
    #39224450
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск записей с самыми последними датами
...
Рейтинг: 0 / 0
26.04.2016, 10:15
    #39224455
miwaonline
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск записей с самыми последними датами
Alimkulov__Avenger__,
row_number() в каком версии FB?
3.0
...
Рейтинг: 0 / 0
26.04.2016, 10:20
    #39224457
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск записей с самыми последними датами
Bit_Man,
Да действительно более оптимальный вариант
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE INDEX Table_IDX1 ON Table1 (Дата, Элемент);

  with tempTable as (
          select Элемент, max(Дата) as Дата
          from Table1
         where Дата <= '01.04.2016'
         group by Элемент
        )
  select t.*
     from tempTable c
     left join Table1 t on
         ((c.Дата = t.Дата) and (c.Элемент= t.Элемент))  




PLAN JOIN (SORT (C Table1 INDEX (Table1_IDX1)), T INDEX (Table1_IDX1))
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Поиск записей с самыми последними датами / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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