使用基于SQL的日期的列创建新列

时间:2014-06-10 09:35:37

标签: sql postgresql indexing pgadmin

编辑:的确,订单错了。

我对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,

谢谢, 添

1 个答案:

答案 0 :(得分:0)

为了清楚起见,我已经调整了列名。最重要的提示 - 不要将SQL语言用于列名(日期,整数,文本,表格,索引等)。

你想要一个window function - 它可以查看一个"窗口"在整个结果集上。在这种情况下,您需要row_numberperson_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)