8.3之前的Postgresql版本的不同行数
我有一个表,它返回给我如下内容:8.3之前的Postgresql版本的不同行数,sql,postgresql,Sql,Postgresql,我有一个表,它返回给我如下内容: name | value John | 3 John | 4 John | 5 Robert | 10 Robert | 6 Robert | 4 等等 我需要在不同的名称上显示行数,如下所示: row_num | name | value 1 | John | 3 1 | John | 4 1 | John | 5 2 | Robert | 10 2 | Robert
name | value
John | 3
John | 4
John | 5
Robert | 10
Robert | 6
Robert | 4
等等
我需要在不同的名称上显示行数,如下所示:
row_num | name | value
1 | John | 3
1 | John | 4
1 | John | 5
2 | Robert | 10
2 | Robert | 6
2 | Robert | 4
主要的问题是我的Postgres版本是8.2,我现在无法升级,所以在做了研究之后,我发现一些有用的功能在我的版本上是不可用的,比如row_number,generate_series,等等
有办法吗?这适用于您的示例数据:
SELECT
COALESCE(r.row_num, m.row_max) AS row_num,
t.name,
t.value
FROM tmp t
LEFT JOIN (
SELECT
r1.name,
COUNT(*) AS row_num
FROM (SELECT DISTINCT name FROM tmp) r1
JOIN (SELECT DISTINCT name FROM tmp) r2
ON r1.name > r2.name
GROUP BY 1) r
ON t.name = r.name
LEFT JOIN (
SELECT
COUNT(*) AS row_max
FROM (SELECT DISTINCT name FROM tmp) r3
) m ON True;
select (select count(distinct name) from person p2 where p2.name <= p1.name) as cnt,
p1.name,
p1.value
from person p1
order by p1.name;
我只能在9.4上测试它,但我认为它也应该在8.x上工作,但不会很快
SQLFiddle:
但您确实应该升级到受支持和维护的版本使用临时视图模拟子查询和CTE的老把戏:
CREATE TABLE a (name text, val integer);
INSERT INTO a (name , val ) VALUES
('John' , 3 )
, ('John' , 4 )
, ('John' , 5 )
, ('Robert' , 10 )
, ('Robert' , 6 )
, ('Robert' , 4 )
;
CREATE VIEW d AS SELECT DISTINCT name FROM a;
CREATE VIEW c AS
SELECT d0.name, COUNT(*) AS rnk
FROM d d0
JOIN d d1 ON d1. name <= d0.name
GROUP BY d0.name
;
-- SELECT * FROM d;
-- SELECT * FROM c;
SELECT c.rnk, a.name, a.val
FROM a
JOIN c ON a.name = c.name
;
DROP VIEW d;
DROP VIEW c;