从PostgreSQL查询中按条件获取行

时间:2017-10-25 07:45:29

标签: sql postgresql

我有以下查询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(因为没有行)

我该怎么做?

1 个答案:

答案 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)