我有以下查询select * from func1(ID)
如果我这样做:select * from func1(10)
我明白了:
rownum date qty
1 1.1.10 -5
2 1.10.10 6
3 2.10.10 6
4 5.10.10 -2
5 6.10.10 -8
如果我select * from func1(7)
我得到了
rownum date qty
1 1.1.10 -7
2 1.10.10 -6
如果我select * from func1(6)
我得到了
rownum date qty
rownum
是根据我的需要在func1()
中计算的列的顺序(它不是随机编号),您认为编号是正确的。
我想写一个查询,在qty>=0
中找到qty
的第一个显示内容(从下往上搜索!从最高rownum
到最低)并给我{ {1}}行中的{1}}。如果date
没有匹配的行,则会返回第1行的日期。如果没有行返回rownum+1
。
意思是:
qty>=0
输出应为NULL
(因为rownum = 3是自下而上的第一个qty> = 0而且rownum中的日期是+ 1)
select * from func1(10)
输出应为5.10.10
(因为没有数量> = 0所以它给出rownum的日期= 1)
select * from func1(7)
输出应为1.1.10
(因为没有行)
我该怎么做?
答案 0 :(得分:1)
首先从底部不是负面的
t=# with a(i,q) as (values(1,-5),(2,3),(3,-9),(4,-1))
select * from a where i=1 or q>=0 order by case when i=1 then null else i end desc nulls last, q limit 1;
i | q
---+---
2 | 3
(1 row)
所有否定 - 第一行:
t=# with a(i,q) as (values(1,-5),(2,-3),(3,-9),(4,-1))
select * from a where i=1 or q>=0 order by case when i=1 then null else i end desc nulls last, q limit 1;
i | q
---+----
1 | -5
(1 row)
空集:
t=# with a(i,q) as (select 1,1 where false)
select * from a where i=1 or q>=0 order by case when i=1 then null else i end desc nulls last, q limit 1;
i | q
---+---
(0 rows)