Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL从具有特定列值类型的表中获取第三高ID_Sql_Sql Server_Greatest N Per Group - Fatal编程技术网

SQL从具有特定列值类型的表中获取第三高ID

SQL从具有特定列值类型的表中获取第三高ID,sql,sql-server,greatest-n-per-group,Sql,Sql Server,Greatest N Per Group,我有一张桌子 packageid FlightType 230 Common 231 B717 232 A330 233 B717 234 Common 235 B767 236 A330 237 A330 238 A330 239 A33

我有一张桌子

packageid   FlightType
    230         Common
    231          B717
    232          A330
    233          B717
    234         Common
    235          B767
    236          A330
    237          A330
    238          A330
    239          A330
    240          B767
    241          B767
    242          B767
使用SELECT MaxPackageID AS PackageID,FlightType FROM Packages GROUP BY FlightType,我能够获得每个FlightType的最大PackageID,如下所示

PackageID   FlightType
239         A330
233         B717
242         B767
234        Common
但我的要求是一个SQL,它将为每个flightType返回第三高的Packageid。在所有飞行类型中都使用通用。因此,在返回值的同时,应该对每种航班类型进行计数。e、 g.对于FlightTYpe B717,最大PackageID为234,因此第三大PackageID为231。对于给定的表,查询输出应为

PackageID   FlightType
237         A330
231         B717
240         B767
注意:-我不要求输出的“common”的packageid第三高。因为它表示所有FlightType通用的包

用这个

用于每个FlightType的过滤器

WITH CTE
AS
(
    SELECT
        SeqNo = ROW_NUMBER() OVER(PARTITION BY FlightType ORDER BY PackageId DESC),
        *
        FROM Packages
)
SELECT
    *
    FROM CTE
        WHERE SeqNo = 3
每个PackageType的筛选器

WITH CTE
    AS
    (
        SELECT
            SeqNo = ROW_NUMBER() OVER(PARTITION BY PackageId ORDER BY FlightType DESC),
            *
            FROM Packages
    )
    SELECT
        *
        FROM CTE
            WHERE SeqNo = 3
将3替换为任意数字,以获取每个包的相应记录
例:1-取最大值,2取第二大值等,我认为在你的预期结果中,B717有一个错误,应该是231而不是230 如果正确,您可以尝试以下方法:

首先,让我们创建一个内存中的表,我们可以在其中进行测试

declare @Packages table (packageid int, flighttype varchar(10))
insert into @Packages (packageid, flighttype)
values (230, 'Common'), (231, 'B717'), (232, 'A330'), (233, 'B717'), (234, 'Common'), (235, 'B767'),
       (236, 'A330'), (237, 'A330'), (238, 'A330'), (239, 'A330'), (240, 'B767'), (241, 'B767'), (242, 'B767')
现在请回答您的问题:

select distinct p.flighttype,
       (select top 1 p3.packageid from
         ( select top 3 p2.packageid from @packages p2 where p2.flighttype = p.flighttype order by p2.packageid desc ) p3
         order by p3.packageid
       )  
from   @packages p
结果是:

flighttype  packageid   
----------  ---------   
A330        237 
B717        231 
B767        240 
Common      230 

这将获得所有第三大包装ID,如果只有两个,则将获得第二个,如果只有一个,则将获得第一个

如果预期结果是第三位之前的最大位置:

with cte as ( 
    select    packageid
            , flighttype
            , ROW_NUMBER() OVER(Partition by flighttype order by packageid desc) as pos
    from #Packages)
select *
from cte c1
where pos = (select max(c2.pos) from cte c2 where pos<=3 and c1.FlightType = c2.FlightType)

您应该搜索行_编号的用法为什么它应该返回230的B717,而不是其他?预期结果与描述不一致。它没有任何理由地排除了普通,它为B717选择了230,B717不是第三个而是第二个。你应该描述一下为什么你希望结果是这样posted@sepupic更糟糕的是,B717没有包装230。我想他是说231对不起,我想说B767有240个作为第二个包,那么为什么我们不得到241个,这是第三个,B717根本没有第三个,所以结果很奇怪,如果没有第三个,我们应该得到第二个吗?230个怎么样?对于每种飞行类型,你会得到第三个最大的是,但是在他的预期结果中也有230个,没有第三大,只有第二大。但是他在他的要求中说第三大。当你阅读他的描述时,你的答案是绝对正确的,但当你看他的预期结果时,你的答案是不正确的。OP应该会把这件事弄清楚的,干得好。它得到的结果与我的答案相同,但我认为这将比我的答案更好way@cloudsafe,对不起,回复得太晚了。此查询通过将“common”也视为单个flightType返回第三大值。但是这里的“Common”表示所有飞行类型都通用的Pckageid。请看一下我的最新问题。谢谢你的回答。你的结果和预期的一样,但方法不同。B717应返回包装ID 231。但这并不是因为只有两个packageid,而是因为itB717的最大packageid是234,这是所有航班都有的。请看一下我的最新问题。