>

세금을 나타내는 다음과 같은 데이터가 있다고 가정하겠습니다.

SELECT trunc(i*i, 3) tax
  FROM generate_series(1.17, 5) i;
    tax   
 -------- 
   1.368  
   4.708  
  10.048  
  17.388  
 (4 rows)

PostgreSQL에서 밀 을 다음 줄에 넣을 수있는 좋은 방법이 있습니까? 현재 줄이 마지막 줄이면 남은 부분이 모두 있어야합니다.

따라서 다음과 같이 만들어야합니다 :

   tax   
 -------- 
   1.360  
   4.710  
  10.050  
  17.392  
 (4 rows)

쿼리 또는 SQL/PL/pgSQL 함수일 수 있습니다.

  • 답변 # 1

    다음 행과 마지막 행은 정렬 순서가 정의 된 경우에만 의미가 있습니다. 정렬 순서가 tax asc 에 의해 정의되었다고 가정합니다. .

    첫 번째 하위 쿼리는 데이터에 행 번호를 추가하고 두 번째 하위 쿼리는 행 수를 계산합니다. 다음 부분은 행 번호 증가에 따른 재귀입니다.

    with recursive data as (
        select trunc(i*i, 3) tax, row_number() over (order by i) as rn
        from generate_series(1.17, 5) i
    ),
    count as (
        select count(*)
        from data
    ),
    result as (
        select 
            tax, rn, 
            floor(tax* 100)/100 as new_tax, 
            tax- floor(tax* 100)/100 as remainder
        from data
        where rn = 1
    union all
        select 
            d.tax, d.rn, 
            case d.rn 
                when count then d.tax+ r.remainder
                else floor((d.tax+ r.remainder)* 100)/100 end as new_tax, 
            d.tax+ r.remainder- floor((d.tax+ r.remainder)* 100)/100 as remainder
        from data d
        join result r on d.rn = r.rn+ 1
        cross join count
    ) 
    select new_tax as tax
    from result
    order by rn;
    
    

    Rextester의 라이브 데모.

  • 이전 R에서 현재 행과 이전 행을 비교
  • 다음 SQL/PHP 모든 것을 리턴하는 WHERE 작성 방법