【问题标题】:Select every specific variable only if it has the most recent timestamp仅当每个特定变量具有最新的时间戳时才选择它
【发布时间】:2017-01-18 16:49:26
【问题描述】:

我有一张像这样的桌子-

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

我想做的是选择ChangeNewValue,但前提是它是最近的时间戳。具体来说,我只想在 ChangeNewValueQuarantined - 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"

我要求您在回答中使用我在这篇文章中放置的标签,以避免混淆。

【问题讨论】:

  • 这个时间戳真的在表中吗?为什么是分开的?
  • 底层 DBMS 是什么?
  • 时间戳在表中,不知道你说的DBMS是什么意思。我假设这意味着数据库管理结构?
  • 这是通过 QlikView 使用的 SQL Server

标签: sql qlikview


【解决方案1】:

SQL 服务器/甲骨文:

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'

【讨论】:

  • 请检查对原帖的编辑。这是在 QlikView 中完成的,因此请记住这一点。我编写了您的 SQL Server 代码,但没有得到我希望的结果。
  • 我也刚刚尝试了您的 MySQL 代码。虽然它们中的任何一个都没有错误,但数字还差得很远。
【解决方案2】:

试试这个

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,但这应该很好用

【讨论】:

    【解决方案3】:

    这就是为我做的。

    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;
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-24
      • 2014-02-06
      • 2021-10-31
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多