postgresql - 如何从 postgresql 中的查询中获取最小值、中值和最大值?

标签 postgresql

我写了一个查询,其中一列是一个月。从那里我必须得到最小月份、最大月份和中位数月份。以下是我的查询。

select ext.employee,
       pl.fromdate,
       ext.FULL_INC as full_inc,
       prevExt.FULL_INC as prevInc,
       (extract(year from age (pl.fromdate))*12 +extract(month from age (pl.fromdate))) as month,
       case
         when prevExt.FULL_INC is not null then (ext.FULL_INC -coalesce(prevExt.FULL_INC,0))
         else 0
       end as difference,
       (case when prevExt.FULL_INC is not null then (ext.FULL_INC - prevExt.FULL_INC) / prevExt.FULL_INC*100 else 0 end) as percent
from pl_payroll pl
  inner join pl_extpayfile ext
          on pl.cid = ext.payrollid
         and ext.FULL_INC is not null
  left outer join pl_extpayfile prevExt
               on prevExt.employee = ext.employee
              and prevExt.cid = (select max (cid) from pl_extpayfile
                                 where employee = prevExt.employee
                                 and   payrollid = (
                                   select max(p.cid)
                                   from pl_extpayfile,
                                        pl_payroll p
                                   where p.cid = payrollid
                                   and   pl_extpayfile.employee = prevExt.employee
                                   and   p.fromdate < pl.fromdate
                                 )) 
              and coalesce(prevExt.FULL_INC, 0) > 0 
where ext.employee = 17 
and (exists (
    select employee
    from pl_extpayfile preext
    where preext.employee = ext.employee
    and   preext.FULL_INC <> ext.FULL_INC
    and   payrollid in (
      select cid
      from pl_payroll
      where cid = (
        select max(p.cid)
        from pl_extpayfile,
             pl_payroll p
        where p.cid = payrollid
        and   pl_extpayfile.employee = preext.employee
        and   p.fromdate < pl.fromdate
      )
    )
  )
  or not exists (
    select employee
    from pl_extpayfile fext,
         pl_payroll p
    where fext.employee = ext.employee
    and   p.cid = fext.payrollid
    and   p.fromdate < pl.fromdate
    and   fext.FULL_INC > 0
  )
)
order by employee,
         ext.payrollid desc

如果不可能,是否可以获得最大月份和最小月份?

最佳答案

要在 PostgreSQL 中计算中位数,只需取 50% 的百分位数(无需添加额外的函数或任何东西):

SELECT PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY x) FROM t;

关于postgresql - 如何从 postgresql 中的查询中获取最小值、中值和最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12067656/

相关文章:

sql - Postgresql - 如何从每个月的最后一条记录中获取值

postgresql - Postgres : remove check constraint on varchar column

java - 在 PostgreSql 中处理 RFID 的最佳方式?

mysql - Django mysql count distinct 给 postgres 不同的结果

sql - 删除重复行(不要删除所有重复行)

python - SQLAlchemy(Postgres) 和事务

使用 Grails 的 Hibernate 和 postgreSQL

java - 创建一个休息服务来调用和执行一个 postgres 函数

spring - 如何在 Spring Data 的查询中使用表函数

postgresql - PostgreSQL 上 $libdir 的问题