PostgreSQL当前的特定值计数

时间:2018-07-12 16:44:14

标签: sql postgresql

我需要实现一个视图,例如:

+------------+----------+--------------+----------------+------------------+
|  Parent id | Expected | Parent Value | Distinct Value | Distinct Value 2 |
+------------+----------+--------------+----------------+------------------+
|          1 |  001.001 |            3 | 6/1/2017       |         5,000.00 |
|          1 |  001.002 |            3 | 9/1/2018       |         3,500.00 |
|          1 |  001.003 |            3 | 1/7/2018       |         9,000.00 |
|          2 |  002.001 |            7 | 9/1/2017       |         2,500.00 |
|          3 |  003.001 |            5 | 3/6/2017       |         1,200.00 |
|          3 |  003.002 |            5 | 16/8/2017      |         8,700.00 |
+------------+----------+--------------+----------------+------------------+

在这里我得到具有相同父项的不同子对象,但是无法使“ Expected”列起作用。那些零并不重要,我只需要使像“ 1.1”,“ 1.2”这样的子索引起作用即可。我尝试了rank()函数,但似乎并没有真正的帮助。

任何帮助表示感谢,在此先感谢。

我最初的尝试如下:

SELECT DISTINCT
  parent.parent_id, 
  rank() OVER ( order by parent_id ) as expected,
  parent.parent_value,
  ct.distinct_value,
  ct.distinct_value_2
FROM parent
LEFT JOIN (crosstab (...) ) 
  AS ct( ... ) 
ON ...

1 个答案:

答案 0 :(得分:1)

使用窗口功能中的partition by parent_idorder by another_colparent_id分组定义顺序。

with parent(parent_id, another_col) as (
    values (1, 30), (1, 20), (1, 10), (2, 40), (3, 60), (3, 50)
)

select 
    parent_id, 
    another_col,
    format('%s.%s', parent_id, row_number() over w) as expected
from parent
window w as (partition by parent_id order by another_col);

 parent_id | another_col | expected 
-----------+-------------+----------
         1 |          10 | 1.1
         1 |          20 | 1.2
         1 |          30 | 1.3
         2 |          40 | 2.1
         3 |          50 | 3.1
         3 |          60 | 3.2
(6 rows)