我昨天发布一个问题,找到在一系列行中获取的方法,在倒数第二个位置添加到表中的那个(按日期过滤)看到链接。
我昨天的问题是,当我尝试应用过滤器时,查询无法正常工作,而我所缺少的是在所有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
返回:
倒数第二个日期是2018-03-03。
如果我运行第一个查询,那就是正确返回:
但是如果我尝试使用另一个具有不同倒数第二个日期的prdid,它就不起作用。
示例(查询3)
select lstid, prdid, lstfchdes from precios (nolock)
WHERE lstid='L04' and prdid='NO7415'
order by lstfchdes desc
所以,我正在尝试这个,但我明白,也许不能正常工作因为有不同的倒数第二个日期(查询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')
我正在尝试这个,但没有工作:
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'
但这会返回代码存在的所有行,而不仅仅是倒数第二个日期。
有什么建议吗?谢谢!
答案 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()
函数基本上将行拆分为组,然后按递减日期的顺序计算出来。如果有关系的潜力,那么你可能会遇到一些并发症,但这肯定是在正确的道路上。