2015-04-19 5 views
0

EDIT: Мои фактические выберите выглядит следующим образом:Выберите определенную запись из выбранного запроса

select x.id, x.name, x.status, y.edit, y.date 
, LEAD(y.date) OVER (PARTITION BY x.id ORDER BY y.date) - date AS edit_diff 
from (table1 x left join table2 y on x.id = y.id) 
where x.id = 1 

результат выглядит следующим образом:

ID Name Status Edit Date   edit_diff 
1  n1  closed edt1  01/01/2005 6 
1  n1  closed edt1  07/01/2005 8 
1  n1  closed edt2  15/01/2005 5 
1  n1  closed edt2  20/01/2005 3 
1  n1  closed edt3  23/01/2005 null 

Я на самом деле хочу, чтобы мои выбрать, чтобы вернуться только изменения со старыми датами:

ID Name Status Edit Date   edit_diff 
1  n1  closed edt1  01/01/2005 14 
1  n1  closed edt2  15/01/2005 8 
1  n1  closed edt3  23/01/2005 null 

Помогите? Я пробовал (SELECT edit from mytable WHERE DATE = MAX(DATE)), но он не работает, так как у меня есть order by по тому же запросу. Благодарю.

ответ

2

Вы можете использовать row_number() назначить последовательное значение для каждого редактирования и просто выбрать первый один:

SELECT id, name, status, edit, date, edit_diff 
FROM (SELECT id, name, status, edit, date, 
      LEAD(date) OVER (PARTITION BY id ORDER BY date) - date AS edit_diff, 
      ROW_NUMBER() OVER (PARTITION BY id, edt ORDER BY date) as seqnum 
     FROM mytable 
    ) t 
WHERE seqnum = 1; 

При ближайшем рассмотрении, вы не выбираете строки, но их агрегацию. Таким образом, это, кажется, больше, что вы хотите:

SELECT id, name, status, edit, min(date), sum(edit_diff) 
FROM (SELECT id, name, status, edit, date, 
      LEAD(date) OVER (PARTITION BY id ORDER BY date) - date AS edit_diff 
     FROM table1 x left join table2 y on x.id = y.id 
    ) t 
GROUP BY id, name, status, edit; 

EDIT:

версия должна быть просто:

SELECT id, name, status, edit, min(date), sum(edit_diff) 
FROM (SELECT x.id, x.name, x.status, y.edit, y.date, 
      LEAD(y.date) OVER (PARTITION BY x.id ORDER BY y.date) - y.date AS edit_diff 
     FROM mytable 
     WHERE x.id = 1 
    ) t 
GROUP BY id, name, status, edit; 
+0

Я попробовал ваш второй код и выдает эту ошибку: ORA-00904 : '" x "." name ": недопустимый идентификатор. Идентификатор FYI, имя, статус и редактирование поступают из разных таблиц (я не знаю, имел ли это инцидент): 'select x.id, x.name, x.status, y.edit, y.date from (table1 x left join table2 y on x.id = y.id) где x.id = 1 ' – RidRoid

+1

В моем ответе и в вашем вопросе нет' x.name' или 'y.edit'. Если у вас другой вопрос, вы должны задать ему другой вопрос. Это предназначено для ответа на вопрос, который вы * задали *, используя имя таблицы 'mytable', которое * вы * предоставили. –

+0

Моя ошибка, извините за это :) Я обновил свой вопрос с помощью правильного запроса (я подумал, что это не повлияет на решение, так как я пытаюсь манипулировать результатом запроса select, а не самого запроса ...) – RidRoid

Смежные вопросы