2017-01-18 3 views
1

У меня есть таблица, которая выглядит как this-Выберите каждую конкретную переменную, только если она имеет самую последнюю метку времени

ChangeKeyValue ChangeFieldName ChangeOldValue ChangeNewValue 
106 OGCSTATUSID 20 10 
106 OGCSTATUSID 10 20 
106 DATALOADSTATUSID 10 20 
106 DATAAMOUNTSTATUSID 10 20 
106 OGCSTATUSID 20 10 
106 DATALOADSTATUSID 20 10 
106 DATAAMOUNTSTATUSID 20 10 
106 OGCSTATUSID Not Yet Reviewed Under Review 
106 OGCSTATUSID 20 Not Yet Reviewed 
106 DATALOADSTATUSID Not Loaded Loaded - Outside DSC 
106 DATALOADSTATUSID Loaded - Outside DSC Not Loaded 
106 DATAAMOUNTSTATUSID None Partial 
106 DATAAMOUNTSTATUSID Partial Full 
106 DATAAMOUNTSTATUSID 30 None 
106 OGCSTATUSID Not Yet Reviewed Under Review 
106 OGCSTATUSID 20 Not Yet Reviewed 
106 DATALOADSTATUSID Not Loaded Loaded - Outside DSC 
106 DATALOADSTATUSID 20 Not Loaded 
106 DATAAMOUNTSTATUSID None Partial 
106 DATAAMOUNTSTATUSID 20 None 
106 OGCSTATUSID Not Yet Reviewed Rejected - Do Not Load 
106 OGCSTATUSID Rejected - Do Not Load Not Yet Reviewed 
106 DATALOADSTATUSID Not Loaded Loaded - Outside DSC 
106 DATALOADSTATUSID Loaded - Outside DSC Not Loaded 
106 DATAAMOUNTSTATUSID None Partial 
106 DATAAMOUNTSTATUSID Partial None 
106 OGCSTATUSID Not Yet Reviewed Under Review 
106 OGCSTATUSID Under Review Not Yet Reviewed 
106 DATALOADSTATUSID Not Loaded Loaded - Outside DSC 
106 DATALOADSTATUSID Loaded - Outside DSC Not Loaded 
106 DATAAMOUNTSTATUSID None Partial 
106 DATAAMOUNTSTATUSID Partial Quarantined - DSC 

И метка выглядит как this-

2016-03-01 11:03:01.703 
2016-03-01 11:37:11.117 
2016-03-01 11:37:27.933 
2016-03-01 11:37:30.017 
2016-03-01 11:37:40.837 
2016-03-01 11:37:43.250 
2016-03-01 11:37:45.890 
2016-03-01 12:55:47.567 
2016-03-01 12:56:42.347 
2016-03-01 12:56:46.917 
2016-03-01 12:56:51.413 
2016-03-01 12:56:54.737 
2016-03-01 12:57:01.293 
2016-03-01 12:57:03.500 
2016-03-01 12:59:39.487 
2016-03-01 12:59:43.443 
2016-03-01 12:59:47.840 
2016-03-01 12:59:51.410 
2016-03-01 12:59:55.147 
2016-03-01 12:59:57.137 
2016-03-01 13:03:10.350 
2016-03-01 13:03:12.450 
2016-03-01 13:03:15.677 
2016-03-01 13:03:17.813 
2016-03-01 13:03:21.067 
2016-03-01 13:03:24.127 
2016-03-01 14:24:46.523 
2016-03-01 14:24:52.347 
2016-03-01 14:24:56.480 
2016-03-01 14:24:59.363 
2016-03-01 14:25:02.777 
2016-03-01 14:25:05.640 

То, что я хочу сделать выбирает ChangeNewValue, но только если это самая последняя отметка времени. В частности, я хочу выбрать самую последнюю временную метку, только если ChangeNewValue - Quarantined - DSC.

Пожалуйста, обратите внимание, что код QlikView я использую (безуспешно) является следующим образом-

Left keep 
Table6: 
Load 
ChangeKeyValue as ITMSNumber, 
IF(ChangeNewValue='Quarantined - DSC', date(Today()) - Floor(date(TIMESTAMP(ChangeDate, 'YYYY-MM-DD hh.mm.ss.fff')))); 

SQL SELECT ChangeKeyValue, 
ChangeNewValue, 
ChangeDate 
FROM MPL.dbo."tblCHANGE"; 

Имя таблицы MPL.dbo."tblCHANGE"

Я прошу вас, пожалуйста, используйте метки, которые я положил на этом посту в вашем ответе, чтобы избежать путаницы.

+1

Действительно ли это временная метка в таблице? Почему это отдельно? – Siyual

+0

Что такое базовая СУБД? – JohnHC

+0

Временная метка находится в таблице, и я не знаю, что вы подразумеваете под СУБД. Я предполагаю, что это означает структуру управления базами данных? –

ответ

0

Это то, что сделал это для меня.

SQL 
    SELECT ITMSNumber,Date_Chg,DATEDIFF(dd,Date_Chg,GETDATE()) AS tDays 
    FROM tblSTRATEGY Strgy 
     inner join 
      (SELECT ChangeKeyValue AS ITMS_Chg,MAX(ChangeDate) AS Date_Chg 
      FROM tblCHANGE Chg 
      WHERE ChangeFieldName='DATALOADSTATUSID' 
       AND ChangeNewValue='Quarantined - DSC' 
      GROUP BY ChangeKeyValue 
     ) Chg1 ON Chg1.ITMS_Chg=Strgy.ITMSNumber 
    WHERE Strgy.DATALOADSTATUSID=30 
    ORDER BY TDAYS; 

Надеюсь, это поможет.

0

SQL сервера/Oracle:

with CTE as 
(
select a1.*, row_number() over(partition by ChangeFieldName order by TimeStampField) as R_ORD 
from MyTable a1 
) 
select * 
from CTE 
where R_ORD = 1 
and ChangeNewValue = 'Quarantined - DSC' 

MySQL:

select * 
from 
(
select ChangeFieldName, max(TimeStampField) as maxField 
from MyTable 
group by ChangeFieldName 
) a1 
inner join MyTable a2 
on a1.ChangeFieldName = a2.ChangeFieldName 
and a1.maxField = a2.TimeStampField 
and a2.ChangeNewValue = 'Quarantined - DSC' 
+0

Проверьте исходное сообщение. Это делается в QlikView, поэтому имейте это в виду. Я сделал ваш код SQL Server и не получил результатов, на которые я надеялся. –

+0

Я также попробовал свой код MySQL. Хотя для любой из них нет ошибки, цифры уходят. –

0

попробовать этот

SQL: 
SQL SELECT ChangeKeyValue, 
ChangeNewValue, 
ChangeDate 
FROM MPL.dbo."tblCHANGE"; 

left join (SQL) 
Load max(ChangeDate) as Max_ChangeDate 
resident SQL 
where ChangeNewValue='Quarantined - DSC'; 

Table6: 
Load 
ChangeKeyValue as ITMSNumber, 
date(Today()) - Floor(date(TIMESTAMP(ChangeDate, 'YYYY-MM-DD hh.mm.ss.fff'))) 
resident SQL 
where ChangeDate=Max_ChangeDate and ChangeNewValue='Quarantined - DSC'; 

drop field Max_ChangeDate; drop table SQL; 

для меньше кода вы можете также использовать inner join или right join, но это должно работать очень хорошо