2016-11-29 137 views
0

要求:响应用户输入StartDate,EndDate和Upper Data Threshold,生成基于电话号码输出数据的查询。SQL MS Access查询的排除条件

这些输入变量是查询的边界。因此,SELECT语句被写在下面。

唯一需要注意的是,如果某个电话号码的单个记录超过了上限数据阈值,则与该违规电话号码关联的所有电话号码记录都不应输出,而不管该电话号码的其他记录是什么不违反数据阈值。下面是样本输入和预期输出:

Invc Date Mobile Nbr  PktDtVol Difference in Days 
--------- ----------  -------- ------------------- 
7/15/15 718-500-2311 3kB    304 
8/15/15 718-500-2311 45kB   304 
9/15/15 718-500-2311 25kB   304 
10/15/15 514-300-3311 33kB   304 
11/15/15 514-300-3311 20kB   304 

我当前的解决方案:

PARAMETERS [Start Date] DateTime, [End Date] DateTime, [Upper Bound 
Usage in KB] IEEEDouble; 

SELECT [Master].[Invc Date], [Master].PktDtVol, [Master].[Mobile Nbr], 
DateDiff("d",[Start Date],[End Date]) AS [Difference in days] INTO 
Temp_Table 
FROM [Master] 
WHERE ((([Master].[Invc Date]) >= [Start Date] And 
     ([Master].[Invc Date])<=[End Date]) AND 
     (([Master].PktDtVol)<= [Upper Bound Usage in KB])); 

不期望的647-409-8206记录在[Temp_Table]

User input Start Date: 1/15/2015 
User input End Date: 11/15/2015 
User input Upper Data Threshold in kB: 50 

[Master] Table in Access: 
Invc Date Mobile Nbr  PktDtVol 
--------- ----------  -------- 
1/15/15 647-409-8206 48kB 
2/15/15 647-409-8206 33kB 
3/15/15 647-409-8206 8000kB 
4/15/15 647-409-8206 20kB 
5/15/15 647-409-8206 10kB 
6/15/15 647-409-8206 0kB 
7/15/15 718-500-2311 3kB 
8/15/15 718-500-2311 45kB 
9/15/15 718-500-2311 25kB 
10/15/15 514-300-3311 33kB 
11/15/15 514-300-3311 20kB 

的预期输出在输出中,因为只有1条记录超过了50kB(第3条记录),所以所有的647-409-8206条记录都将被相应省略。

请欣赏任何帮助!谢谢!

+0

那些看起来像真正的电话号码和搜索作为真正的电话号码。你确定你想和很多人分享吗? – Fionnuala

+0

他们肯定是假的数字,我相应地修改了数据 - 但谢谢! – stitch70

+0

您似乎也有一些设计错误。 – Fionnuala

回答

1

首先编写一个子查询,选择一行违反阈值的所有(不同的)移动号码。之后从表中选择所有行WHERE [Mobile Nbr] NOT IN (subquery)

+0

这两个答案都有帮助!下面是我使用的精确SELECT语句:PARAMETERS [开始日期] DateTime,[结束日期] DateTime,[上限用法KB] IEEEDouble; 选择m [Invc Date],m.PktDtVol,m。[Mobile Nbr],DateDiff(“d”,[开始日期],[结束日期])AS [天数之差] INTO Temp_Table FROM Master AS m WHERE(m。[Invc Date]> = [开始日期]和m。[Invc Date])<= [结束日期] AND m。[Mobile Nbr] NOT IN (SELECT q。[Mobile Nbr] FROM Master AS q WHERE(q.PktDtVol> = [上限KB用法]); – stitch70

+0

在跟进中,有没有一种方法来优化?我正在处理> 100,000条记录,并且查询目前需要很长时间才能完成(接近挂起) – stitch70

+0

取决于数据库系统 - 我不倾向于使用ms-access(并且如果切换是一个选项我推荐Postgres,SQL Server或Oracle,或轻量级应用程序的SQLite),但我可以想象,MS Access处理子查询的效果很差。所以你可以在子查询中尝试'LEFT OUTER JOIN',添加一个'WHERE'子句,确保子查询键'IS NULL'。基本上'SELECT ... FROM表LEFT OUTER JOIN(子查询)s ON ... WHERE s。[Mobile Nr] IS NULL'。这应该确保子查询只评估一次。 –

1

这是相当粗糙的,你的设计需要工作,但它应该给你一个开始。

PARAMETERS [Start Date] DATETIME, [End Date] DATETIME, [Upper Bound Usage in KB] 
IEEEDOUBLE; 

SELECT m.[invc date], 
     m.[mobile nbr], 
     m.[pktdtvol], 
     Datediff("d", [start date], [end date]) AS [Difference in days] 
INTO temp_table 
FROM master AS m 
WHERE m.[invc date] >= [start date] 
     AND m.[invc date] <= [end date] 
     AND m.[mobile nbr] NOT IN 
      (SELECT q.[mobile nbr] 
      FROM master q 
      WHERE q.pktdtvol >= [upper bound usage in kb]) 
+0

不幸的是,这不起作用,因为我的记录集超过了60,000条记录。我试图使用INDEXING,到目前为止它没有工作。是否有另一种解决方案,或者INDEXING没有被正确使用?我使用“CREATE INDEX”创建了一个索引 – stitch70