我有一个计划任务,每天运行一次,使用cfspreadsheet将查询返回的数据输出到excel文件中。我想弄清楚的是获取查询返回的数据,将其存储在“存储区域”中的最佳方法,并使用此存储的数据对当前数据的结果和先前数据的结果进行比较以仅显示NEW来自第二天生成的报告数据中的列的值。
<cfset startDate = "#DateFormat(DateAdd('d',-1,Now()),'mm/dd/yyyy')# 00:00:00" />
<cfset endDate = "#DateFormat(DateAdd('d',-1,Now()),'mm/dd/yyyy')# 23:59:59" />
SELECT DISTINCT TBLA.SerialID AS SerialID
,TBLA.BRND AS Model
,(SELECT TOP 1 E3.DNAME FROM TBLB E3 WHERE TBLA.USID = E3.USID AND E3.EOR = '3') AS EOR3DNAME
,(SELECT TOP 1 E3.VN FROM TBLB E3 WHERE TBLA.USID = E3.USID AND E3.EOR = '3') AS EOR3APPVN
,RELATION.GROUPID AS GroupID
,CONVERT(varchar, LOGDATETIME, 22) AS CheckIn
FROM TBLA
INNER JOIN RELATION ON TBLA.SerialID = RELATION.SerialID
LEFT OUTER JOIN TBLB E3 ON TBLA.USID = E3.USID
WHERE TBLA.LOGDATETIME >= <cfqueryparam cfsqltype="cf_sql_timestamp" value="#CreateODBCDateTime(beginDate)#" />
AND TBLA.LOGDATETIME <= <cfqueryparam cfsqltype="cf_sql_timestamp" value="#CreateODBCDateTime(endDate)#" />
AND TBLA.BRND LIKE (<cfqueryparam cfsqltype="cf_sql_varchar" value="%MER%" list="true" />)
ORDER BY CheckIn ASC
我想对我的查询做的另一个调整是应用一个条件来显示基于仅序列ID和最新logdatetime(CheckIn)时间戳的DISTINCT值。
重申一下,当进程从“存储区域”和当前数据进行比较时,要确定要在新报告上显示哪些数据,它会比较所有SerialID并将其与当前数据进行检查,以仅输出具有新serialID或serialID的行在“存储区”。
从我读过的内容来看,最好通过DB通过存储过程或在MSSQL中设置VIEW来实现这一点,因为我正在使用数千个数据。但是,我也读过我可以使用Solr / CFCollection。我更倾向于依靠DB端然后通过应用程序,因为在那一端有更多的可靠性。任何建议或方向都将不胜感激。
我正在运行MSSQL Server 2008和CF10。
编辑:这是我正在使用更新的代码,但遇到麻烦,让循环工作。
我基本上手动创建了包含先前数据的serialID的新表。
新serialID的表 选择serialID作为SID 来自blahList
循环遍历#serialList#query,以便我可以排除与新报告中找到的serialID匹配的所有数据。 上面的长查询占位符在我的帖子中,这个条件添加到最后循环连续 在哪里tbla.SerialID不在(“#SID#”)
QUERY将查询结果中找到的新serialID插入到serialList
对“#longquery#”执行查询查询以编写新的cfspreadsheet报告