Select 每个特定变量仅当它具有最新的时间戳时

Select every specific variable only if it has the most recent timestamp

我有一个 table 看起来像这样-

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

时间戳看起来像这样-

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

我想做的是 select ChangeNewValue 但前提是它是最近的时间戳。具体来说,只有当 ChangeNewValueQuarantined - DSC.

时,我才想 select 最近的时间戳

请注意,我正在使用(未成功)的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";

table 名字是 MPL.dbo."tblCHANGE"

我请求您在回答中使用我在此 post 中添加的标签,以免造成混淆。

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'

试试这个

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 joinright join 但这应该工作得很好

这就是为我做的。

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;

希望对您有所帮助。