如何 select PostgreSQL 查询中的特定行?

How to select specific rows in PostgreSQL query?

我编写了一个查询,以获取结果集中前五行的 'reason_code' 和 'app_count' 以及名称 'others' 下剩余 app_count 的总和。

这是我尝试过的:

(SELECT a.app_pgm_rsnd_rsn_cd, a.denied_app_count
FROM (SELECT app_pgm_rsnd_rsn_cd ,COUNT(1) as denied_app_count
FROM app_pgm_choice, ead_case 
where app_pgm_sts= 'DN'
AND app_pgm_req_dt >= '20150101'
AND app_pgm_req_dt <= '20150130'
AND EAD_CS_APP_NUM =  APP_PGM_NUM
AND EAD_CS_SEND_CNTY_ID = '19'
AND EAD_CS_TRAN_STS = 'PE'
GROUP BY app_pgm_rsnd_rsn_cd
ORDER BY denied_app_count desc) a
WHERE ROWNUM <=5 )

UNION ALL

(SELECT 'OTHERS' as app_pgm_rsnd_rsn_cd, SUM(b.denied_app_count) as    denied_app_count
FROM (SELECT app_pgm_rsnd_rsn_cd ,COUNT(1) as denied_app_count
FROM app_pgm_choice, ead_case 
where app_pgm_sts= 'DN'
AND app_pgm_req_dt >= '20150101'
AND app_pgm_req_dt <= '20150130'
AND EAD_CS_APP_NUM =  APP_PGM_NUM
AND EAD_CS_SEND_CNTY_ID = '19'
AND EAD_CS_TRAN_STS = 'PE'
GROUP BY app_pgm_rsnd_rsn_cd
ORDER BY denied_app_count desc) b
WHERE ROWNUM >=5 )

但是当我 运行 这个查询时它显示以下错误消息:

ERROR: column "rownum" does not exist LINE 13: WHERE ROWNUM <=5 ) ^

********** Error **********

ERROR: column "rownum" does not exist SQL state: 42703 Character: 397

ROWNUM 变量的选项是什么?

试试这个查询

(SELECT a.app_pgm_rsnd_rsn_cd, a.denied_app_count
FROM (SELECT app_pgm_rsnd_rsn_cd ,COUNT(1) as denied_app_count
,row_number() OVER (ORDER BY app_pgm_rsnd_rsn_cd ) AS ROWNUM 
FROM app_pgm_choice, ead_case 
where app_pgm_sts= 'DN'
AND app_pgm_req_dt >= '20150101'
AND app_pgm_req_dt <= '20150130'
AND EAD_CS_APP_NUM =  APP_PGM_NUM
AND EAD_CS_SEND_CNTY_ID = '19'
AND EAD_CS_TRAN_STS = 'PE'
GROUP BY app_pgm_rsnd_rsn_cd
ORDER BY denied_app_count desc) a
WHERE ROWNUM <=5 )

UNION ALL

(SELECT 'OTHERS' as app_pgm_rsnd_rsn_cd, SUM(b.denied_app_count) as    denied_app_count
FROM (SELECT app_pgm_rsnd_rsn_cd ,COUNT(1) as denied_app_count
,row_number() OVER (ORDER BY app_pgm_rsnd_rsn_cd ) AS ROWNUM 
FROM app_pgm_choice, ead_case 
where app_pgm_sts= 'DN'
AND app_pgm_req_dt >= '20150101'
AND app_pgm_req_dt <= '20150130'
AND EAD_CS_APP_NUM =  APP_PGM_NUM
AND EAD_CS_SEND_CNTY_ID = '19'
AND EAD_CS_TRAN_STS = 'PE'
GROUP BY app_pgm_rsnd_rsn_cd
ORDER BY denied_app_count desc) b
WHERE ROWNUM >=5 )

我认为您正在寻找 LIMIT 子句。

SELECT * 
FROM sometable 
ORDER BY denied_app_count DESC
LIMIT 5

ROWNUM 是 Oracle 主义。

对于大于号,您可以使用 OFFSET:

SELECT * 
FROM sometable 
ORDER BY denied_app_count DESC
OFFSET 5

跳过前 5 行,return 剩下的。

在做分页之类的事情时,两者可以并且经常结合使用。

LIMIT and OFFSET

在 PostgreSQL 中,您 可以 使用 row_number() window 函数,但出于您的目的,此处没有必要。另一方面,使用 row_number 进行单个查询然后查询结果 table 两次以获得两个部分可能 更快 。尝试这种方法,看看它是否表现更好。