2016-09-24 124 views
0

我有一个非常具体的问题,我在这里有一年的领域。我需要能够把它们拉出来,并有一个查询条件来查看每一行,并选择年份最大但小于选择列表中选择的年份,因为我使用的连接有很多需要过滤的行。示例我在第1列中有1,2,3,4等行ID。但是我会有一些额外的1说5行1。我想过滤出所有额外的1,在另一列中没有最大年份。因此,需要使用ID列来查看哪些行可以比较,然后只保留年份列中年份最大的行。会有一些需要比较的分组。说出所有的2和3。仍然保持最大的一年,并筛选出那些最小的那些。Meridium SQL查询设计

下面是一种基准线查询,它还筛选我们不再处于服务状态的行。

SELECT CDFT_Test_Results_Primary_M."Equipment ID" "Equipment ID", 
CDFT_Test_Results_Primary_M."Pass/Fail" "Pass/Fail", 
CDFT_Test_Results_Primary_M."Failure Type" "Failure Type", 
CDFT_Test_Results_Primary_M."Desired Interval (MO)" "Desired Interval (MO)", 
CDFT_Test_Results_Primary_M."Task Description" "Task Description", 
CDFT_Test_Results_Primary_M."Year" "Year", 
CDFT_Test_Results_Primary_M."Site" "Site", 
CDFT_Test_Results_Primary_M."Device Type" "Device Type", 
CDFT_Test_Results_Primary_M."Execution Date" "Execution Date", 
CDFT_Test_Results_Primary_M."Eqpt Manufacturer" "Eqpt Manufacturer", 
CDFT_Test_Results_Primary_M."Eqpt Manufacturer Model Num" "Eqpt Manufacturer Model Num", 
CDFT_Test_Results_Primary_M."Eqpt Manufacturer Serial Nu" "Eqpt Manufacturer Serial Nu", 
CDFT_Test_Results_Primary_M."Decommission Year" "Decommission Year", 
CDFT_Test_Results_Primary_M."Commission Year" "Commission Year", 
CDFT_Test_Results_Primary_M."Equipment Key" "Equipment Key", 
CDFT_Test_Results_Primary_M."Test Key" "Test Key" 

FROM (! 'Personal[cmgray1]\Queries\CDFT Updated\CDFT Test Results Primary Multi Year Pre Non-Test') CDFT_Test_Results_Primary_M 

WHERE (((CDFT_Test_Results_Primary_M."Year" <= CDFT_Test_Results_Primary_M."Decommission Year" 
AND CDFT_Test_Results_Primary_M."Year" >= CDFT_Test_Results_Primary_M."Commission Year") 
AND CDFT_Test_Results_Primary_M."Decommission Year" >= (? :s :caption='Year Selection' :id=DecomYear :l='2009','2010','2011','2012','2013','2014','2015','2016','2017','2018','2019','2020' :excl) 
AND CDFT_Test_Results_Primary_M."Commission Year" <= (? :s :caption='Year Selection' :id=DecomYear :l='2009','2010','2011','2012','2013','2014','2015','2016','2017','2018','2019','2020' :excl)) 
OR (CDFT_Test_Results_Primary_M."Decommission Year" IS NULL AND CDFT_Test_Results_Primary_M."Commission Year" IS NULL) 
OR (CDFT_Test_Results_Primary_M."Year" >= CDFT_Test_Results_Primary_M."Commission Year" 
AND CDFT_Test_Results_Primary_M."Decommission Year" IS NULL 
AND CDFT_Test_Results_Primary_M."Commission Year" <= (? :s :caption='Year Selection' :id=DecomYear :l='2009','2010','2011','2012','2013','2014','2015','2016','2017','2018','2019','2020' :excl)) 
OR (CDFT_Test_Results_Primary_M."Year" <= CDFT_Test_Results_Primary_M."Decommission Year" 
AND CDFT_Test_Results_Primary_M."Decommission Year" >= (? :s :caption='Year Selection' :id=DecomYear :l='2009','2010','2011','2012','2013','2014','2015','2016','2017','2018','2019','2020' :excl) 
AND CDFT_Test_Results_Primary_M."Commission Year" IS NULL)) 

正如您在下面看到的,如果按设备ID进行分组,您将在任务描述下获得多年。我希望能够挑选最大的组合并过滤掉其余的组合。例如,2009年应该被滤除,并且2013年的点仍然适用于类似设备ID的设备。

enter image description here

+0

即使是我应该看的方向的想法也没有问题。我一直在这里搁浅了一段时间。 – ColdTeck

+3

你可以用这种格式阅读你自己的查询吗?我不能。请以可读方式格式化,并将其降至核心问题。 –

+0

其中rdbms全部3个?如果全部3个,你通常可以取出oracle和sql-server,因为mysql将成为函数特定方法中更受限制的方法之一。接下来我同意juergen格式化查询,以便它可读。我开始努力,但是不想让你做。接下来,您要求那些很可能知道系统功能的人提供建议,因此我们并不需要这些图像来告诉我们它们是什么。最后应包括示例数据和期望的结果。但是,听起来像你需要重新考虑说明,以最大年份小于输入变量cte与row_number – Matt

回答

0

我结束了由ID使得一个子查询,以组然后用来在该列中的MAX函数。然后,我使用了一个连接函数返回到原始查询,以获得我需要的。