powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка значений по максимальной дате
25 сообщений из 60, страница 2 из 3
Выборка значений по максимальной дате
    #39310080
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nata44845,

last не подойдет?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
  1  with t as (
  2  SELECT 1 PRODUCT,date '2016-09-03' L ,date '2016-09-01' dat FROM dual union all
  3  SELECT 1 PRODUCT,date '2016-09-01' L ,date '2016-09-02' FROM dual union all
  4  SELECT 1 PRODUCT,date '2016-09-02' L ,date '2016-09-03' FROM dual union all
  5  SELECT 1 PRODUCT,date '2016-09-01' L ,date '2016-09-03' FROM dual union all
  6  SELECT 2 PRODUCT,date '2016-08-22' L ,date '2016-08-02' FROM dual union all
  7  SELECT 2 PRODUCT,date '2016-08-21' L ,date '2016-08-02' FROM dual
  8  )
  9  select
 10   product
 11  ,max(l) KEEP (DENSE_RANK last ORDER BY dat) tl
 12  ,max(dat) td
 13  from t
 14* group by product
SQL> /

   PRODUCT TL       TD
---------- -------- --------
         1 02.09.16 03.09.16
         2 22.08.16 02.08.16



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

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

Я сначала думала, что если у него сортирует по дате, то дальше сортировка по умолчанию ROWID ASC, возможно так и есть.
...
Рейтинг: 0 / 0
Выборка значений по максимальной дате
    #39310120
nata44845
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не, по ROWID как раз другой результат выходит.
...
Рейтинг: 0 / 0
Выборка значений по максимальной дате
    #39310191
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nata44845stax..,

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

Я сначала думала, что если у него сортирует по дате, то дальше сортировка по умолчанию ROWID ASC, возможно так и есть.
по умолчанию на ROWID полагаться не стоит

зы
если я правильно понял задачку через KEEP DENSE_RANK LAST можно сразу и PRICE вытаскивать (без JOIN)

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

Ты имеешь ввиду вот так

Код: sql
1.
max(price) KEEP (DENSE_RANK last ORDER BY dat) tl



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

По идее нужны товары по которым есть четко и цена и количество, то есть если цену не передавали вроде как и не надо или если количество нулевое.

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

Хомяков вон джунгарских на магазине вообще -3 числится, хомяки мрут...
...
Рейтинг: 0 / 0
Выборка значений по максимальной дате
    #39310731
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nata44845Для максимума цены по максимальной дате достаточно, но логически не верно, за одну и ту же дату до секунд по идее последняя цена будет не та, которая больше, а которая по L больше, потому что позже внесена и для нее L как ид позже выделен.Ну так досортируй.
...
Рейтинг: 0 / 0
Выборка значений по максимальной дате
    #39311332
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nata44845Вообще думаю стоит переделывать запрос через левый джойн или не стоит.

По идее нужны товары по которым есть четко и цена и количество, то есть если цену не передавали вроде как и не надо или если количество нулевое.

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

Хомяков вон джунгарских на магазине вообще -3 числится, хомяки мрут...

переделать или нет Вам решать
если задачка свежая я б переделал (древнее не трогаю)
Код: 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.
SQL> ed
Wrote file afiedt.buf

  1  with t as (
  2   SELECT 1 PRODUCT,date '2016-09-03' L ,date '2016-09-01' dat,10 price FROM dual union all
  3   SELECT 1 PRODUCT,date '2016-09-01' L ,date '2016-09-02',20 FROM dual union all
  4   SELECT 1 PRODUCT,date '2016-09-02' L ,date '2016-09-03',30 FROM dual union all
  5   SELECT 1 PRODUCT,date '2016-09-01' L ,date '2016-09-03',40 FROM dual union all
  6   SELECT 2 PRODUCT,date '2016-08-22' L ,date '2016-08-02',50 FROM dual union all
  7   SELECT 2 PRODUCT,date '2016-08-21' L ,date '2016-08-02',60 FROM dual
  8  )
  9   select
 10    product
 11   ,max(l) KEEP (DENSE_RANK last ORDER BY dat) tl
 12   ,max(dat) td
 13   ,max(price) KEEP (DENSE_RANK last ORDER BY dat,l) tl
 14   from t
 15* group by product
SQL> /

   PRODUCT TL       TD               TL
---------- -------- -------- ----------
         1 02.09.16 03.09.16         30
         2 22.08.16 02.08.16         50



.......
stax
...
Рейтинг: 0 / 0
Выборка значений по максимальной дате
    #39311348
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насколько я понял, ищется простая и эффективная реализация top-N запроса по ценам товара, сам товар берется из каталога.
обратите внимание на статью xtender-а:
http://orasql.org/2012/09/21/distinct-values-by-index-topn/
...
Рейтинг: 0 / 0
Выборка значений по максимальной дате
    #39313317
попробуй так, может получится

SELECT summ,
ident,
MAX(pdate) OVER (PARTITION BY ident)
FROM pay
...
Рейтинг: 0 / 0
Выборка значений по максимальной дате
    #39313849
nata44845
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Влепила это по итогу в шапку и сделала максимум по цене там где дата до секунд совпадает.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT * FROM 
(SELECT DP.ID,DP.CODE,DP.NAME,
     (SELECT
      NVL(max(PRICE) KEEP (DENSE_RANK last ORDER BY DATE),0) PRICE
      FROM DT
      WHERE DP.ID=DT.PRODUCT) PRICE
FROM
 DP)
WHERE PRICE>0
ORDER BY name1 ASC,name asc



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

case им сделай хотя бы :)
...
Рейтинг: 0 / 0
Выборка значений по максимальной дате
    #39314870
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nata44845Влепила это по итогу в шапку и сделала максимум по цене там где дата до секунд совпадает.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT * FROM 
(SELECT DP.ID,DP.CODE,DP.NAME,
     (SELECT
      NVL(max(PRICE) KEEP (DENSE_RANK last ORDER BY DATE),0) PRICE
      FROM DT
      WHERE DP.ID=DT.PRODUCT) PRICE
FROM
 DP)
WHERE PRICE>0
ORDER BY name1 ASC,name asc



Пока не знаю надо там список с пустыми ценами или нет.

про секунды не понял
но с учетом "а которая по L больше", я БЫ сортировочку по L добавил ORDER BY DATE,L

Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
SQL> l
  1  with dt as (
  2   SELECT 1 PRODUCT,date '2016-09-03' L ,date '2016-09-01' dat,10 price FROM dual union all
  3   SELECT 1 PRODUCT,date '2016-09-01' L ,date '2016-09-02',20 FROM dual union all
  4   SELECT 1 PRODUCT,date '2016-09-02' L ,date '2016-09-03',30 FROM dual union all
  5   SELECT 1 PRODUCT,date '2016-09-01' L ,date '2016-09-03',40 FROM dual union all
  6   SELECT 2 PRODUCT,date '2016-08-22' L ,date '2016-08-02',50 FROM dual union all
  7   SELECT 2 PRODUCT,date '2016-08-21' L ,date '2016-08-02',60 FROM dual
  8  )
  9  ,dp as (
 10  select 1 id,'stax' code ,'Stanislav' name from dual union all
 11  select 2 id,'nata' code ,'Natali' name from dual
 12  )
 13  SELECT * FROM
 14  (SELECT DP.ID,DP.CODE,DP.NAME,
 15       (SELECT
 16        NVL(max(PRICE) KEEP (DENSE_RANK last ORDER BY DAT),0) PRICE
 17        FROM DT
 18        WHERE DP.ID=DT.PRODUCT) PRICE
 19  FROM
 20   DP)
 21  WHERE PRICE>0
 22* ORDER BY name ASC,code asc
SQL> /

        ID CODE NAME           PRICE
---------- ---- --------- ----------
         2 nata Natali            60
         1 stax Stanislav         40

SQL>
SQL> ed
Wrote file afiedt.buf

  1  with dt as (
  2   SELECT 1 PRODUCT,date '2016-09-03' L ,date '2016-09-01' dat,10 price FROM dual union all
  3   SELECT 1 PRODUCT,date '2016-09-01' L ,date '2016-09-02',20 FROM dual union all
  4   SELECT 1 PRODUCT,date '2016-09-02' L ,date '2016-09-03',30 FROM dual union all
  5   SELECT 1 PRODUCT,date '2016-09-01' L ,date '2016-09-03',40 FROM dual union all
  6   SELECT 2 PRODUCT,date '2016-08-22' L ,date '2016-08-02',50 FROM dual union all
  7   SELECT 2 PRODUCT,date '2016-08-21' L ,date '2016-08-02',60 FROM dual
  8  )
  9  ,dp as (
 10  select 1 id,'stax' code ,'Stanislav' name from dual union all
 11  select 2 id,'nata' code ,'Natali' name from dual
 12  )
 13  SELECT * FROM
 14  (SELECT DP.ID,DP.CODE,DP.NAME,
 15       (SELECT
 16        NVL(max(PRICE) KEEP (DENSE_RANK last ORDER BY DAT,L),0) PRICE
 17        FROM DT
 18        WHERE DP.ID=DT.PRODUCT) PRICE
 19  FROM
 20   DP)
 21  WHERE PRICE>0
 22* ORDER BY name ASC,code asc
SQL> /

        ID CODE NAME           PRICE
---------- ---- --------- ----------
         2 nata Natali            50
         1 stax Stanislav         30



.....
stax
...
Рейтинг: 0 / 0
Выборка значений по максимальной дате
    #39315043
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..но с учетом "а которая по L больше", я БЫ сортировочку по L добавил ORDER BY DATE,L 19676439
...
Рейтинг: 0 / 0
Выборка значений по максимальной дате
    #39315288
nata44845
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..,

С учетом поставленной задачи я решила плюнуть на L, чисто логически если рассуждать я не знаю как передаются эти задвоенные цены на кассу, передаются они скорее всего в xml, а как там дальше загружается и в каком порядке...

Получается, что покупатель увидит на сайте одну цену, даже закажет товар может быть по этой цене, придет в магазин, а там цена выше, выйдет скандалъ.
Пусть она лучше на сайте будет больше, зато потом будет приятный сюрприз. Приятные сюрпризы лучше, чем неприятные.
...
Рейтинг: 0 / 0
Выборка значений по максимальной дате
    #39315627
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nata44845stax..,

С учетом поставленной задачи я решила плюнуть на L, чисто логически если рассуждать я не знаю как передаются эти задвоенные цены на кассу, передаются они скорее всего в xml, а как там дальше загружается и в каком порядке...

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

ведь может быть и обратный ефект, зашел я на ваш сайт, посмотрем цену, дорого, и купил в другом магазине, а ведь в касе дешевле было

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

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

Substr(max(to_char(date,'yyyymmddhh24miss')||price),15,19)

Что в общем то аналогично вашему варианту, но возможно работает на ранних версиях тоже.
...
Рейтинг: 0 / 0
Выборка значений по максимальной дате
    #39315812
j2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nata44845Что в общем то аналогично вашему варианту, но возможно работает на ранних версиях тоже.
Если price у вас number, то не совсем идентично
Код: plsql
1.
2.
with t as (select 1000 a from dual union all select 200 a from dual)
select Substr(max(to_char(sysdate,'yyyymmddhh24miss')||a),15,19) from t
...
Рейтинг: 0 / 0
Выборка значений по максимальной дате
    #39315837
nata44845
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
j2k,

Черт, и правда выбирают как бог на душу положит.
...
Рейтинг: 0 / 0
Выборка значений по максимальной дате
    #39315879
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nata44845j2k,

Черт, и правда выбирают как бог на душу положит.
а скорее всего уже символьное раз a),15,19

по старинке так и делали
||to_char(a,'09999999999999999.99999999')


Выбор максимальной записи по определенному полю

.....
stax
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Выборка значений по максимальной дате
    #39665160
nata44845
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то заплутала, есть запрос акций типа

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT 
 DL.PRODUCT DPID, DA.ID DAID, DD.F14745601 FROM_DATE, DD.F14745602 TO_DATE,
  NVL(DL.F62455833,0) CEN_PRICE,  NVL(F28835874,0) CNT,
    CASE WHEN DD.F33620496='88000000000B232A' THEN 7
         WHEN DD.F33620496='88000000000B2329' THEN 8 END DOC_TYPE
  FROM DOCUMENT DD JOIN LINE DL ON DD.ID=DL.DOCUMENT
  JOIN AGENT DA ON DA.ID=DD.DEPARTMENT
  WHERE ((DD.CLASS=14417922) AND (DD.TYPE=28835915)) AND 
    (DD.F33620496 IN ('88000000000B232A','88000000000B2329')
     OR DD.F6684705='07D2000307D20002'
     AND (DD.F14286862='07D2000307D20002' OR DD.F14286862 IS NULL))
  AND DD.STATE=1
  AND DA.CLASS=2 AND DA.TYPE=14745607 
  AND DD.F14745602>=TO_DATE('20180622 16:00:00','YYYYMMDD hh24:mi:ss')



Выбирает все акции актуальные на текущий момент, для всех товаров и всех отделов

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

Понимаю, что в скобки обвести и выбрать
SELECT DPID,DAID,MIN(FIRST_DATE), а как сюда остальные поля по строке включить?
...
Рейтинг: 0 / 0
Выборка значений по максимальной дате
    #39665182
nata44845
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант с
Код: sql
1.
2.
3.
4.
5.
6.
SELECT DPID, DAID, MIN(FROM_DATE),
    MIN(TO_DATE) KEEP (DENSE_RANK first ORDER BY FROM_DATE) TO_DATE,
    MIN(CEN_PRICE) KEEP (DENSE_RANK first ORDER BY FROM_DATE) CEN_PRICE,
    MIN(CNT) KEEP (DENSE_RANK first ORDER BY FROM_DATE) CNT,
    MIN(DOC_TYPE) KEEP (DENSE_RANK first ORDER BY FROM_DATE) DOC_TYPE FROM
...



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

Добавить туда DD.ID и сделать order by DD.ID

Или за одну и ту же дату сказать сами дураки и ничего не делать...
...
Рейтинг: 0 / 0
Выборка значений по максимальной дате
    #39665184
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nata44845,

AND DD.F14745602<=sysdate

.....
stax
...
Рейтинг: 0 / 0
Выборка значений по максимальной дате
    #39665196
nata44845
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Типа такого

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SELECT DPID, DAID, MIN(FROM_DATE) FROM_DATE,
    MIN(TO_DATE) KEEP (DENSE_RANK first ORDER BY FROM_DATE,DDID) TO_DATE,
    MIN(CEN_PRICE) KEEP (DENSE_RANK first ORDER BY FROM_DATE,DDID) CEN_PRICE,
    MIN(CNT) KEEP (DENSE_RANK first ORDER BY FROM_DATE,DDID) CNT,
    MIN(DOC_TYPE) KEEP (DENSE_RANK first ORDER BY FROM_DATE,DDID) DOC_TYPE FROM
  (SELECT /*+FIRST_ROWS(1)  INDEX(T18546854 DB1_DOCUMENT_BY_TYPE_DATE)*/ 
  DL.PRODUCT DPID, DA.ID DAID, DD.ID DDID, DD.F14745601 FROM_DATE, DD.F14745602 TO_DATE,
  NVL(DL.F62455833,0) CEN_PRICE,  NVL(F28835874,0) CNT,
    CASE WHEN DD.F33620496='88000000000B232A' THEN 7
         WHEN DD.F33620496='88000000000B2329' THEN 8 END DOC_TYPE
  FROM DOCUMENT DD JOIN LINE DL ON DD.ID=DL.DOCUMENT
  JOIN AGENT DA ON DA.ID=DD.DEPARTMENT
  WHERE ((DD.CLASS=14417922) AND (DD.TYPE=28835915)) AND 
    (DD.F33620496 IN ('88000000000B232A','88000000000B2329')
     OR DD.F6684705='07D2000307D20002'
     AND (DD.F14286862='07D2000307D20002' OR DD.F14286862 IS NULL))
  AND DD.STATE=1
  AND DA.CLASS=2 AND DA.TYPE=14745607 
  AND DD.F14745602>=TO_DATE('20180601 00:00:00','YYYYMMDD hh24:mi:ss')
) 
  GROUP BY DPID,DAID
...
Рейтинг: 0 / 0
Выборка значений по максимальной дате
    #39665202
nata44845
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

DD.F14745602 это как раз дата прекращения, надо те которые на текущий момент не прекращены.

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

С минимумом вроде тоже разобралась
...
Рейтинг: 0 / 0
25 сообщений из 60, страница 2 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка значений по максимальной дате
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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