2017-02-21 23 views
0

У меня есть таблица следующего характера. Процесс транзакций в базе данных, где находится эта таблица, следует по пути, когда пользователь может изменить дату доставки одного, более одного или всех элементов. Теперь, я хочу, это набор строк, где пользователь обновляет дату доставки, соответствующую конкретным элементам. Вы можете видеть, что PO_Number одинаково для всех элементов, а также PO_Date. Итак, как запросить и отобразить требуемые строки?Фильтрация данных на основе конкретных записей и времени обновления

PO_NO  PO_DT  ITEM_CODE DEL_DATE UPDATED_ON OLD_DEL_DATE  NEW_DEL_DATE 
======================================================================================== 
01T0/05/2015 UP01662 24/06/2015 23/5/2015  20/06/2015  24/06/2015 
01T0/05/2015 UP01762 22/06/2015 21/5/2015  20/06/2015  22/06/2015 
01T0/05/2015 UP01661 24/06/2015 23/5/2015  20/06/2015  24/06/2015 
01T0/05/2015 UP01763 22/06/2015 21/5/2015  20/06/2015  22/06/2015 

Пожалуйста, рассмотрим сценарий, если пользователь делает свою последнюю сделку и сроки поставки обновлений для item_code- (UP01662, UP01661) для (скажем) 10-й раз на день. Тогда в конце все, что я хочу, это запрос, который извлекает наборы данных только для этих двух элементов и ничего больше.

Любая помощь будет очень признательна.

+0

Я не Я понимаю, что вам нужно. Если данные, которые вы опубликовали, являются необходимым результатом, можете ли вы отправить исходные данные? Или, если это исходные данные, каков должен быть результат? – Aleksej

+0

Пожалуйста, ребята, дайте мне знать, если мне нужно разработать проблему здесь. Мне действительно нужно решение для этого. – hashir

+0

Это исходные данные. Я разработаю поток для вас. Пользователь обновляет данные по форме, а обработанный столбец - UPDATED_ON, OLD_DEL_DATE и NEW_DEL_DATE. Теперь создается триггер, который запускается при каждом обновлении, и этот триггер должен извлекать те строки, для которых эти три столбца были обновлены. Возможно, существует несколько сценариев, например, пользователь обновляет два элемента для заказа. Таким образом, запрос должен извлекать только эти две строки, а не любую другую строку. Теперь, если у вас есть вопросы относительно «вопроса»? – hashir

ответ

0

я думаю, что это может помочь U немного https://social.msdn.microsoft.com/Forums/sqlserver/en-US/4a0742b7-b976-42b7-8230-4ae46441a63a/when-was-the-last-time-a-record-was-addedmodified-in-a-sql-table?forum=transactsql

declare @objectid int 
    select @objectid = object_id from sys.objects where name = 'YOURTABLENAME' 

    select top 1 * from sys.dm_db_index_usage_stats where object_id = @objectid 
    and last_user_update is not null 
    order by last_user_update 
+0

Это не Oracle – Aleksej

+0

@ venky513 Мне нужно сделать это в sql оракула, sql-сервер здесь не является questoin. Еще спасибо за рассмотрение проблемы. Было бы здорово, если бы вы могли предоставить решение для sql оракула. – hashir

+0

@Aleksej Да, можете ли вы предоставить его? – hashir

0

Идея заключается в том, чтобы создать пользовательскую функцию, чтобы проверить, если какой-либо столбец был изменен и после запуска обновления. Если вы знаете некоторые столбцы, которые всегда должны меняться при каждом обновлении, это еще проще проверить, изменилась ли ваша строка или нет, иначе вам нужно будет проверить все столбцы из user_tab_columns для вашей таблицы.

Для общего подхода, пожалуйста, проверьте: https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:59412348055

+0

В колонке UPDATED_ON изменяется каждая строка при каждом обновлении. Проблема заключается в извлечении строк, затрагиваемых отдельным запросом, который может быть функцией, процедурой или курсором. Также скажите мне, если: old и: new могут использоваться в общем запросе, кроме использования в триггере. – hashir

+0

Из предоставленной ссылки:: new и: old похожи на переменные bind на триггер, они не являются «регулярными» переменными. вы не можете динамически обращаться к ним. Если вы хотите, чтобы функция не вызывалась триггером, то когда/что ее вызывает? И он будет проверять, изменилась ли какая-либо запись с тех пор? Вы можете либо сохранить последний раз, когда вы проверили, либо зеркально отобразить изображение таблицы, и проверить его. – Alex

+0

Проблема не является стартовым братом. Все, что мне нужно, это запрос, который может извлекать последние обновленные строки и ничего больше. Это самый простой способ выразить это. – hashir

0

Пожалуйста, дайте мне знать, если это то, что вам нужно.

create table xx_ap_orders ( po_number varchar2(10) 
          , item_code varchar2(10) 
          , amount number 
          , updated_date date 
          ); 

Итак, сценарий:

все записи были обновлены 5 дней назад

строка с кодом элемента MOUSE был обновлен 4 дня назад

КАБЕЛЬ и Batery пункт коды были обновлены 2 дней назад.

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

insert into xx_ap_orders values ('PO_500','LAPTOP', 3500, trunc (sysdate - 5)); 
insert into xx_ap_orders values ('PO_500','MOUSE', 200, trunc (sysdate - 4)); 
insert into xx_ap_orders values ('PO_500','CABLE', 100, trunc (sysdate - 2)); 
insert into xx_ap_orders values ('PO_500','BATERY', 500, trunc (sysdate - 2)); 

Если вы хотите выбрать только CABLE и Batery записи (последний обновленный) у вас есть следующий SQL:

SELECT * FROM (
SELECT po_number 
     , item_code 
     , amount 
     , updated_date 
     , rank() OVER (PARTITION BY po_number 
        order by updated_date desc) rank_updated 
FROM XX_AP_ORDERS) 
WHERE rank_updated = 1 
; 
+0

большое усилие @Alex. Но это решение просто отстает на шаг. Когда я впервые обновил столбец UPDATED_DATE, все будет хорошо, и только полученные строки будут извлечены через предоставленный вами запрос. Но решение не выполняет мое требование, когда я обновляю любой другой элемент (во время второго обновления). Предположим, я обновил только одну строку в первом раунде (скажем) «BATERY». Я запускаю запрос, сглаживая результат одной строкой. – hashir

+0

Следующий раунд, и я обновляю 'LAPTOP' AND 'MOUSE', а затем запускает запрос, результат, полученный в результате, имеет 3 строки, включая строку, обновленную в первом раунде. Мне нужно, чтобы после каждого раунда выполнения запроса возвращались только строки, затронутые/только в этом раунде, а не в предыдущих раундах. – hashir

+0

ОБНОВЛЕНИЕ xx_ap_orders SET amount = amount +50 , updated_Date = sysdate; - выполнить запрос: все 4 записи принес UPDATE xx_ap_orders SET сумма = сумма - 50 , updated_Date = SYSDATE ГДЕ ITEM_CODE В ('MOUSE', 'КАБЕЛЬ'); - запустите запрос: 2 записи извлечены – Alex