我对SQL很陌生,我使用pgAdminIII。在我们的数据库中,我们存储不同日期的报告对于每个人,我们有大约10个报告。为了仅比较每个人的最新或第二个最新报告,我想添加一个列,指定它是否是最新的。它看起来像这样(简化),索引列是我想要创建的那个。
PersonID Date Index
A 2013Q4 3
A 2014Q1 2
A 2014Q2 1
B 2013Q4 2
B 2014Q1 1
B 2013Q2 3
C 2013Q1 5
C 2013Q3 3
C 2013Q2 4
C 2013Q4 2
C 2014Q1 1
> CREATE OR REPLACE VIEW My.db AS
> a."Date",
> a."PersonID",
FROM my.db a;
我已经尝试了一些索引功能,但它们不起作用:
INDEX(a."PersonID", a."Date") AS "Index",
和
CAST
INDEX(a."PersonID", a."Date") END AS Index,
谢谢, 添
答案 0 :(得分:0)
为了清楚起见,我已经调整了列名。最重要的提示 - 不要将SQL语言用于列名(日期,整数,文本,表格,索引等)。
你想要一个window function - 它可以查看一个"窗口"在整个结果集上。在这种情况下,您需要row_number
对person_id
进行分区(因此当人员更改时会重置)并由report_date
排序。第二个例子颠倒了排序。
richardh=> SELECT person_id,report_date,row_number() over (partition by person_id order by report_date) FROM t1 ORDER BY person_id, report_date;
person_id | report_date | row_number
-----------+-------------+------------
A | 2013Q2 | 1
A | 2013Q3 | 2
A | 2013Q4 | 3
B | 2013Q1 | 1
B | 2013Q2 | 2
B | 2013Q3 | 3
B | 2013Q4 | 4
C | 2013Q3 | 1
C | 2013Q4 | 2
D | 2013Q1 | 1
D | 2013Q2 | 2
D | 2013Q4 | 3
(12 rows)
richardh=> SELECT person_id,report_date,row_number() over (partition by person_id order by report_date desc) FROM t1 ORDER BY person_id, report_date;
person_id | report_date | row_number
-----------+-------------+------------
A | 2013Q2 | 3
A | 2013Q3 | 2
A | 2013Q4 | 1
B | 2013Q1 | 4
B | 2013Q2 | 3
B | 2013Q3 | 2
B | 2013Q4 | 1
C | 2013Q3 | 2
C | 2013Q4 | 1
D | 2013Q1 | 3
D | 2013Q2 | 2
D | 2013Q4 | 1
(12 rows)