2012-03-13 106 views
0

对于下面的代码,我想看看是否有选择最高转速的方式。编号在PATTERN.VERSION列中,然后仅显示低于该值的结果。SQL选择最大,然后显示值小于最大

在列显示的日期是这样的:

Version 
-------- 
2012-03-12 rev. 035  
2012-03-12 rev.035  
2012-03-12 rev.017 

在这种情况下,我想查询以选择rev.035的最大,然后只显示较低的值(转017)。 。我试图用MAX聚合和小于但不能得到正确结果的子查询。

SELECT DISTINCT "SEM_AGENT"."DELETED" 
    ,"PATTERN"."VERSION" 
    ,"PATTERN"."PATTERNDATE" 
    ,"SEM_AGENT"."AGENT_VERSION" 
    ,"SEM_CLIENT"."COMPUTER_NAME" "Computer Name" 
    , "SEM_COMPUTER"."OPERATION_SYSTEM" "Operation System" 
    ,dateadd(s,convert(bigint,"SEM_AGENT"."CREATION_TIME")/1000,'01-01-1970 00:00:00') CREATION_DTTM 
    , dateadd(s,convert(bigint,"SEM_AGENT"."LAST_UPDATE_TIME")/1000,'01-01-1970 00:00:00') Lastupdatetime 
    , DATEADD(s, convert(bigint,LAST_SCAN_TIME)/1000, '01-01-1970 00:00:00')"Last Scan Time" 
    , "PATTERN"."PATTERNDATE" "Pattern Date" 
    , "SEM_CLIENT"."USER_NAME" "User Name" 
    , "V_SEM_COMPUTER"."IP_ADDR1_TEXT" "IP Address" 
    , "IDENTITY_MAP"."NAME" "Group Name" 
FROM (((("SEM_AGENT" "SEM_AGENT" INNER JOIN "SEM_CLIENT" "SEM_CLIENT" 
    ON (("SEM_AGENT"."COMPUTER_ID"="SEM_CLIENT"."COMPUTER_ID") 
    AND ("SEM_AGENT"."DOMAIN_ID"="SEM_CLIENT"."DOMAIN_ID")) 
    AND ("SEM_AGENT"."GROUP_ID"="SEM_CLIENT"."GROUP_ID")) INNER JOIN "SEM_COMPUTER" "SEM_COMPUTER" 
    ON (("SEM_AGENT"."COMPUTER_ID"="SEM_COMPUTER"."COMPUTER_ID") 
    AND ("SEM_AGENT"."DOMAIN_ID"="SEM_COMPUTER"."DOMAIN_ID")) 
    AND ("SEM_AGENT"."DELETED"="SEM_COMPUTER"."DELETED")) INNER JOIN "PATTERN" "PATTERN" 
    ON "SEM_AGENT"."PATTERN_IDX"="PATTERN"."PATTERN_IDX") INNER JOIN "IDENTITY_MAP" "IDENTITY_MAP" 
    ON "SEM_CLIENT"."GROUP_ID"="IDENTITY_MAP"."ID") INNER JOIN "V_SEM_COMPUTER" "V_SEM_COMPUTER" 
    ON "SEM_COMPUTER"."COMPUTER_ID"="V_SEM_COMPUTER"."COMPUTER_ID" 
    AND "SEM_AGENT"."DELETED"=0 


ORDER BY "Computer Name" 

示例行

IP Address DELETED VERSION PATTERNDATE AGENT_VERSION Computer Name Operation System CREATION_DTTM Lastupdatetime Last Scan Time Pattern Date User Name Group Name ip_address device_type user_tag 
16X.XX.XX.XX 0 2012-03-13 rev. 002 3/13/2012 12:00:00 AM 12.1.671.4971 MD-EISN-1206 Windows XP Professional  11/10/2011 8:25:46 PM 3/13/2012 7:49:25 PM 3/11/2012 1:00:05 PM 3/13/2012 12:00:00 AM ECOPYSCAN My Company\AHRQ\eCOPY-machines 16X.XX.XX.XX Desktop |fisma-mgmt|fisma-all| 
16X.XX.XX.XX 0 2012-03-13 rev. 002 3/13/2012 12:00:00 AM 12.1.671.4971 HHS-46801948 Windows XP Professional  11/10/2011 8:25:46 PM 3/13/2012 7:49:25 PM 3/11/2012 12:00:02 PM 3/13/2012 12:00:00 AM EcopyIOD My Company\AHRQ\eCOPY-machines 16X.XX.XX.XX Desktop |workstations|network scanners|fisma-mgmt|desktops|fisma-all| 
16X.XX.XX.XX 0 2012-03-13 rev. 002 3/13/2012 12:00:00 AM 12.1.671.4971 HHS-46801937 Windows XP Professional  11/10/2011 8:25:46 PM 3/13/2012 7:49:25 PM 3/11/2012 12:00:03 PM 3/13/2012 12:00:00 AM tim.erny My Company\AHRQ\eCOPY-machines 16X.XX.XX.XX Desktop |network scanners|fisma-mgmt|desktops|fisma-all| 
+0

什么版本的SQL? – 2012-03-13 19:24:06

+0

我使用SQL Server 2008 – Ben 2012-03-13 19:29:38

+0

如果__WHERE Pattern.Version <(选择最大(从图案版))__不能正常工作,那么你有一些分组我无法从你的查询得到。你能否显示这个查询返回的一些行? – 2012-03-13 19:43:32

回答

0

首先,回答:你可以使用一个RANK功能的子查询的beargle上述建议(在这里不需要CTE,比也许漂亮的东西等)

(SELECT PatternID, RANK() OVER (ORDER BY Version DESC) AS Ranking) AS RankTbl 
WHERE Ranking > 1 

RANK会给同级别到相同的版本(这听起来像你想要的),但如果你想要每个版本条目的唯一排名,那么你会想要使用ROW_NUMBER()

但是,这只会运作,如果你运行某种SUBSTRING从日期中选出修订版,以便它可以按pr执行订单operly。创建一个更加标准化的数据库将使它更容易些,但(见下文)

其次,一些注意事项:

  • 你不应该需要围绕你查询的每一个部分双引号。它只是使代码不易读。如果你必须使用一个描绘,然后用方括号[]
  • 如果可以,从版本的日期删除修订。这将让你得到更接近普通的数据库,并允许您将版本,没有任何字符串操作

这些只是我的上述想法排序...

0

使用RANK功能的CTE内,使用ORDER BY到版本号降序排列。然后从CTE中选择其中RANK的值大于1.

请参阅样本here

+0

即使修订号字段也包含日期,这是否可以工作? 2012-03-13 rev。 002 – Ben 2012-03-13 19:59:29

+0

不,你需要隔离的具体修订数据,并确保它的统一格式(不知道'rev.'和你的问题'035'之间的空间是一个错字或实际数据)。最好在@Justin Pihony注意到的数据库中这样做,但是您可以使用'CHARINDEX'和'SUBSTRING'来提取CTE定义中的版本号作为解决方法。 – Bryan 2012-03-13 20:18:12