使用过滤器选择倒数第二个记录

时间:2018-03-07 19:33:33

标签: sql sql-server

我昨天发布一个问题,找到在一系列行中获取的方法,在倒数第二个位置添加到表中的那个(按日期过滤)看到链接。

Yestedar question

我昨天的问题是,当我尝试应用过滤器时,查询无法正常工作,而我所缺少的是在所有select中应用过滤器。

例如(查询1):

SELECT prdid, lstfchdes, lstid, lstpusrupd FROM price
WHERE lstfchdes = (SELECT MAX(lstfchdes)
                    FROM price 
                    WHERE lstfchdes < (SELECT MAX(lstfchdes)  
                    FROM price
                    where prdid ='PRO167' and lstid='l04')
                    and prdid = 'PRO167' AND lstid='l04')
and lstid='l04' and prdid='PRO167'

这可以正常工作,但我有一个问题,当我用来过滤的元素,他们有不同的倒数第二个日期。

例如(查询2):

select * from precios (nolock)
WHERE lstid='L04' and prdid='PRO167'
order by lstfchdes desc

返回:

ResultQuery2

倒数第二个日期是2018-03-03。

如果我运行第一个查询,那就是正确返回:

ResultQuery1

但是如果我尝试使用另一个具有不同倒数第二个日期的prdid,它就不起作用。

示例(查询3)

select lstid, prdid, lstfchdes from precios (nolock)
WHERE lstid='L04' and prdid='NO7415'
order by lstfchdes desc

ResultQuery3

所以,我正在尝试这个,但我明白,也许不能正常工作因为有不同的倒数第二个日期(查询4):

SELECT prdid, lstfchdes, lstid, lstpusrupd FROM precios (nolock)
WHERE lstfchdes = (SELECT MAX(lstfchdes)
                    FROM precios (nolock)
                    WHERE lstfchdes < (SELECT MAX(lstfchdes)  
                    FROM precios (nolock)
                    where prdid IN ('PRO167', 'NO7415') and lstid='l04')
                    and prdid IN ('PRO167', 'NO7415') AND lstid='l04')
and lstid='l04' and prdid IN ('PRO167', 'NO7415')

ResultQuery4

我正在尝试这个,但没有工作:

SELECT prdid, lstfchdes, lstid, lstpusrupd FROM precios (nolock)
WHERE prdid IN (select prdid from precios where prdid='PRO167' and lstid='l04'
                and lstfchdes = (SELECT MAX(lstfchdes) from precios
                                 WHERE lstfchdes < (SELECT MAX(lstfchdes)
                                 from precios
                                 where prdid ='PRO167' and lstid='l04')
                                 and prdid ='PRO167' and lstid='l04')
                                 and prdid ='PRO167' and lstid='l04')
 and prdid ='PRO167' and lstid='l04'

但这会返回代码存在的所有行,而不仅仅是倒数第二个日期。

有什么建议吗?谢谢!

1 个答案:

答案 0 :(得分:1)

我认为这样的事情会对你有所帮助。您需要的是最大日期 / prdid,而不是整个查询中的单个最大日期。由于您不处理单个结果,因此子查询不会削减它。

with
    p as (select * from precios where prdid in ('PRO167', 'NO7415') and lstid = 'L04'),
    p_rnk as (
        select *, row_number() over (partition by prdid order by lstfchdes desc) as rn
        from p
    )
select * from p_rnk where rn = 2;

基本思想是,row_number()函数基本上将行拆分为组,然后按递减日期的顺序计算出来。如果有关系的潜力,那么你可能会遇到一些并发症,但这肯定是在正确的道路上。