powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Последнее значение из IN списка
12 сообщений из 12, страница 1 из 1
Последнее значение из IN списка
    #39264825
Туплю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запрос заведомо неверный.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT MAX(ID) max_id, 
       MAX(CASE WHEN ID IN(1, 3) THEN v ELSE NULL END) KEEP(DENSE_RANK LAST ORDER BY dt) max_v
FROM (SELECT 1 ID, SYSDATE dt, 'v1' v FROM dual
      UNION ALL
      SELECT 1 ID, SYSDATE+2 dt, NULL v FROM dual
      UNION ALL
      SELECT 3 ID, SYSDATE+3 dt, 'v2' v FROM dual
      UNION ALL
      SELECT 5 ID, SYSDATE+4 dt, NULL v FROM dual)


В max_v надо достать последнее v по дате для id 1 и 3.
То есть правильный max_v получается так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT MAX(ID) max_id, 
       MAX(v) KEEP(DENSE_RANK LAST ORDER BY dt) max_v
FROM (SELECT 1 ID, SYSDATE dt, 'v1' v FROM dual
      UNION ALL
      SELECT 1 ID, SYSDATE+2 dt, NULL v FROM dual
      UNION ALL
      SELECT 3 ID, SYSDATE+3 dt, 'v2' v FROM dual
      UNION ALL
      SELECT 5 ID, SYSDATE+4 dt, NULL v FROM dual)
 WHERE ID IN(1, 3) 


Но тогда неверно достается max(id)
Как достать в один проход и max(id) и нужный v (последний для id in (1, 3)).
...
Рейтинг: 0 / 0
Последнее значение из IN списка
    #39264836
j2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Туплю, какой результат должен быть на ваших тестовых данных?
...
Рейтинг: 0 / 0
Последнее значение из IN списка
    #39264841
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Туплю,

в денсе-сортировке case when id in (1,3) then 1 else 0 end, dt
...
Рейтинг: 0 / 0
Последнее значение из IN списка
    #39264844
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Туплю,

last_value(CASE WHEN ID IN(1, 3) THEN v ELSE NULL END) over (partition by id order by dt) подойдет?
...
Рейтинг: 0 / 0
Последнее значение из IN списка
    #39264856
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ora601подойдет?
а как на счет ora-00937 ?
...
Рейтинг: 0 / 0
Последнее значение из IN списка
    #39264859
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123ййora601подойдет?
а как на счет ora-00937 ?

C кривыми руками еще и не такое может быть.
...
Рейтинг: 0 / 0
Последнее значение из IN списка
    #39264863
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ora601,

покажи свои прямые руки ?
...
Рейтинг: 0 / 0
Последнее значение из IN списка
    #39264876
Туплю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
j2kкакой результат должен быть на ваших тестовых данных?
На выходе надо получить
max_id - 5
max_v - v2
...
Рейтинг: 0 / 0
Последнее значение из IN списка
    #39264879
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Туплю,

чем не устраивает 19350865 ?
...
Рейтинг: 0 / 0
Последнее значение из IN списка
    #39264900
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123ййora601,

покажи свои прямые руки ?

А что тут показывать, просто нужно знать отличие аналитики от группировки. ( Правда мне не очень понятно, что конкретно имеет ввиду ТС - хочет ли он делать last по группе или таблице вцелом)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT * FROM (
SELECT MAX(ID) OVER (),  
last_value(CASE WHEN ID IN(1, 3) THEN v ELSE NULL END) over (order by dt)  lv
FROM (SELECT 1 ID, SYSDATE dt, 'v1' v FROM dual
      UNION ALL
      SELECT 1 ID, SYSDATE+2 dt, NULL v FROM dual
      UNION ALL
      SELECT 3 ID, SYSDATE+3 dt, 'v2' v FROM dual
      UNION ALL
      SELECT 5 ID, SYSDATE+4 dt, NULL v FROM dual))
WHERE rownum=1



Ну или без last_value :

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT max_id, MAX(v) KEEP(DENSE_RANK LAST ORDER BY dt NULLS LAST) max_v
FROM (
SELECT ID
      ,dt 
	  ,v
	  ,MAX(ID) OVER () max_id
FROM (SELECT 1 ID, SYSDATE dt, 'v1' v FROM dual
      UNION ALL
      SELECT 1 ID, SYSDATE+2 dt, NULL v FROM dual
      UNION ALL
      SELECT 3 ID, SYSDATE+3 dt, 'v2' v FROM dual
      UNION ALL
      SELECT 5 ID, SYSDATE+4 dt, NULL v FROM dual)
	  )
	  WHERE ID in(1,3)
GROUP BY max_id	  



Можно еще через WITH max_id AS (SELECT MAX(ID) ...)
...
Рейтинг: 0 / 0
Последнее значение из IN списка
    #39264942
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эххххх
Код: plsql
1.
2.
3.
4.
select 
   max(id),
   max(case when id in (1,3) then v end) keep (dense_rank last order by case when id in (1,3) then dt end nulls first) max_v
from t
...
Рейтинг: 0 / 0
Последнее значение из IN списка
    #39265160
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ora601А что тут показывать
Действительно - нечего.
посмотри, что требуется 19351089
и сравни, что у тебя.
Ну или без last_value
а зачем делать еще один уровень вложения, сам себе усложняешь жизнь ?
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Последнее значение из IN списка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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