2017-04-06 89 views
1

好吧,假设我有一张表,如下图所示名称appModelFlat只有几百行。它没有日期字段,但我想找出五个最近创建的环境(EnvName)。只有14种可能的环境(EnvName)。但是我想选择插入不同EnvName的五个最近插入的行。也就是说,我想选择不同的EnvName(尽管distinct不以这种方式工作)最近的5行,并且我知道它们是最近的id。该行越新,id越高。任何帮助这个查询将不胜感激。SQL选择排名前五位的最近一行并按特定列区分

id|AppName|EnvName|ServerTypeName|ServerId|OS  |OSVersion|CPU|Memory|ExtraStorage|MachineDesc | 
---------------------------------------------------------------------------------------------------- 
1 |ASB |DEV |App   |1  |Windows|7  |4 |4  |100   |ASB-DEV-App | 

---------------------------------------------------------------------------------------------------- 
5 |AMS |DEV |APP   |2  |RedHat |7.2  |4 |4  |50   |AMS-DEV-App | 

---------------------------------------------------------------------------------------------------- 
6 |SPB |TST |App   |1  |Windows|7  |2 |8  |50   |SPB-TST-App | 

---------------------------------------------------------------------------------------------------- 
7 |SBI |TST |Oracle  |1  |Solaris|11  |4 |8  |100   |SBI-TST-Oracle| 

---------------------------------------------------------------------------------------------------- 

这是我的第一次尝试,虽然我不确定它是否正确。它给我五个结果。

SELECT DISTINCT top 5 [ID] = (SELECT TOP 1 [ID] FROM [AppModelFlat] Y WHERE Y.[EnvName] = X.[EnvName]) 
      ,[AppName]= (SELECT TOP 1 [AppName] FROM [AppModelFlat] Y WHERE Y.[EnvName] = X.[EnvName]) 
      ,[EnvName] 
      ,[ServerTypeName] = (SELECT TOP 1 [ServerTypeName] FROM [AppModelFlat] Y WHERE Y.[EnvName] = X.[EnvName]) 
      ,[ServerId] = (SELECT TOP 1 [ServerId] FROM [AppModelFlat] Y WHERE Y.[EnvName] = X.[EnvName]) 
      ,[OS] = (SELECT TOP 1 [OS] FROM [AppModelFlat] Y WHERE Y.[EnvName] = X.[EnvName]) 
     FROM [AppModelFlat] X order by id desc 

编辑:

对于预期的结果。可以说我只想选择前两名,因为我只给了5个条目。我想回到以下。

5 |AMS |DEV |APP   |2  |RedHat |7.2  |4 |4  |50   |AMS-DEV-App | 

---------------------------------------------------------------------------------------------------- 
7 |SBI |TST |Oracle  |1  |Solaris|11  |4 |8  |100   |SBI-TST-Oracle| 

因为我只有每ENVNAME之一,每行有该行的最高ID号。

+0

我希望我不会粗鲁,但是,除了预期的结果之外,我完全是这样做的。你甚至读过 – camccar

+0

的问题吗?我看到了样本数据,但是显示预期结果有很多帮助,而不是用文字解释。 – TheGameiswar

+0

也尝试看到链接引用知道,如何提出一个完美的问题:https://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-论坛/ – TheGameiswar

回答

1

使用row_number()以获得最新的行每个EnvName,只有采取了top 5有序Id desc

select top 5 * 
from (
    select * 
    , rn = row_number() over (partition by EnvName order by id desc) 
    from appModelFlat 
) s 
where rn = 1 
order by id desc 

top with ties版本:

select top 5 * 
from (
    select top 1 with ties * 
    from appModelFlat 
    order by row_number() over (partition by EnvName order by id desc) 
) s 
order by id desc 
+0

谢谢,这似乎工作。 – camccar

+0

@没有快乐的帮助! – SqlZim

0

一个简单的子查询也将这样的伎俩:

SELECT  TOP 5 Id, AppName, EnvName, ServerTypeName, ServerId, OS 
FROM  AppModelFlat Records 
INNER JOIN (SELECT EnvName, 
        MAX(Id) as Id 
      FROM AppModelFlat) Latest ON Records.Id = Latest.Id 
+0

这不适用于sql server – camccar

+0

对不起,错过了子查询中的GROUP BY EnvName。 – Simon

相关问题