복붙노트

[SQL] 어떻게 PostgreSQL의 2 진수 곳으로 평균을 반올림?

SQL

어떻게 PostgreSQL의 2 진수 곳으로 평균을 반올림?

나는 루비 보석 '속편'을 통해 PostgreSQL을 사용하고 있습니다.

나는 두 개의 소수점을 반올림하기 위해 노력하고있어.

여기 내 코드는 :

SELECT ROUND(AVG(some_column),2)    
FROM table

나는 다음과 같은 오류가 발생합니다 :

PG::Error: ERROR:  function round(double precision, integer) does 
not exist (Sequel::DatabaseError)

나는 다음과 같은 코드를 실행 오류를 얻을 :

SELECT ROUND(AVG(some_column))
FROM table

아무도 내가 잘못하고있는 중이 야 무엇을 알고 있나요?

해결법

  1. ==============================

    1.PostgreSQL은 (배정 밀도, 정수) 라운드 정의하지 않습니다. Sherrill '고양이 리콜'@ 마이크 이유로 코멘트에 설명, 정밀 소요 라운드의 버전 숫자 만 사용할 수 있습니다.

    PostgreSQL은 (배정 밀도, 정수) 라운드 정의하지 않습니다. Sherrill '고양이 리콜'@ 마이크 이유로 코멘트에 설명, 정밀 소요 라운드의 버전 숫자 만 사용할 수 있습니다.

    regress=> SELECT round( float8 '3.1415927', 2 );
    ERROR:  function round(double precision, integer) does not exist
    
    regress=> \df *round*
                               List of functions
       Schema   |  Name  | Result data type | Argument data types |  Type  
    ------------+--------+------------------+---------------------+--------
     pg_catalog | dround | double precision | double precision    | normal
     pg_catalog | round  | double precision | double precision    | normal
     pg_catalog | round  | numeric          | numeric             | normal
     pg_catalog | round  | numeric          | numeric, integer    | normal
    (4 rows)
    
    regress=> SELECT round( CAST(float8 '3.1415927' as numeric), 2);
     round 
    -------
      3.14
    (1 row)
    

    (float8를 double 정밀도 단지 속기 별명입니다 위, 참고. 당신은 PostgreSQL의 출력에 확장되는 것을 볼 수 있습니다).

    당신은 값을 캐스팅해야하는 라운드의 2 인자 양식을 사용하는 숫자로 반올림합니다. 라운드 같은 속기 캐스트에 대한 그냥 APPEND : 숫자 (발 :: 숫자, 2).

    당신이 사용자에게 표시 포맷하는 경우, 라운드 사용하지 마십시오. 당신이 형식을 지정할 수 있습니다 당신에게 숫자 값으로 할 수있는 클라이언트 언어를 불확실성 어떤 영향을받지 않는 텍스트 결과를 제공, : 사용 TO_CHAR (데이터 유형 매뉴얼에 기능을 서식 참조). 예를 들면 :

    regress=> SELECT to_char(float8 '3.1415927', 'FM999999999.00');
        to_char    
    ---------------
     3.14
    (1 row)
    

    서식의 일부로서 당신을위한 TO_CHAR는 것이다 라운드 번호. FM 접두사는 선행 공백과 패딩을 원하지 않는 TO_CHAR를 알려줍니다.

  2. ==============================

    2.주조 또한 이전 구문을 시도,

    주조 또한 이전 구문을 시도,

    SELECT ROUND(AVG(some_column)::numeric,2)    
    FROM table;
    

    PostgreSQL의 모든 버전에서 작동합니다.

    일부 PostgreSQL의 기능에 과부하의 부족이있다, 왜 (???) : (!) 나는 "그것이 부족"하지만 @CraigRinger, @Catcall과 PostgreSQL의 팀이 "페이지의 역사적인 근거"에 대해 동의합니다 생각합니다.

    PS : 반올림에 대한 또 다른 점은 정확성, IanKenney의 대답 @ 검사입니다.

    당신은 함께 ROUND 함수를 오버로드 할 수 있습니다

     CREATE FUNCTION ROUND(float,int) RETURNS NUMERIC AS $$
        SELECT ROUND($1::numeric,$2);
     $$ language SQL IMMUTABLE;
    

    이제 명령 뜻이 잘 작동, 시도 (함수 생성 후)

     SELECT round(1/3.,4); -- 0.3333 numeric
    

    하지만, 텍스트 매개 변수를 제공 할 때 우리는 FLOAT 타입을 반환 할 수 있습니다 첫 번째 commom-사용 과부하를 유지하려면 ... 숫자 형식을 반환

     CREATE FUNCTION ROUND(float, text, int DEFAULT 0) 
     RETURNS FLOAT AS $$
        SELECT CASE WHEN $2='dec'
                    THEN ROUND($1::numeric,$3)::float
                    -- ... WHEN $2='hex' THEN ... WHEN $2='bin' THEN... complete!
                    ELSE 'NaN'::float  -- like an error message 
                END;
     $$ language SQL IMMUTABLE;
    

    시험

     SELECT round(1/3.,'dec',4);   -- 0.3333 float!
     SELECT round(2.8+1/3.,'dec',1); -- 3.1 float!
     SELECT round(2.8+1/3.,'dec'::text); -- need to cast string? pg bug 
    

    추신 : 같은 것을 보여줍니다, 오버로딩 후 라운드 df 명령 \ 확인

     Schema     |  Name | Result data type | Argument data types 
    ------------+-------+------------------+----------------------------
     myschema   | round | double precision | double precision, text, int
     myschema   | round | numeric          | double precision, int
     pg_catalog | round | double precision | double precision            
     pg_catalog | round | numeric          | numeric   
     pg_catalog | round | numeric          | numeric, int          
    

    pg_catalog 기능은 기본 것들입니다 빌드 - 수학 함수의 매뉴얼을 참조하십시오.

  3. ==============================

    3.이것으로 시도 :

    이것으로 시도 :

    SELECT to_char (2/3::float, 'FM999999990.00');
    -- RESULT: 0.67
    

    또는 단순히 :

    SELECT round (2/3::DECIMAL, 2)::TEXT
    -- RESULT: 0.67
    
  4. ==============================

    4.아래의 기능을 사용할 수 있습니다

    아래의 기능을 사용할 수 있습니다

     SELECT TRUNC(14.568,2);
    

    결과가 표시됩니다 :

    14.56
    

    당신은 또한 욕망의 유형에 변수를 캐스트 할 수 있습니다 :

     SELECT TRUNC(YOUR_VAR::numeric,2)
    
  5. ==============================

    5.브라이언의 반응에 따라 당신은 쿼리의 소수를 제한하기 위해이 작업을 수행 할 수 있습니다. 나는 m / s로의 km / h로 변환하고 dygraphs에 표시하지만 dygraphs 그것을했을 때 그것은 이상한 보였다. 대신 쿼리에서 계산을 수행 할 때 외모는 미세. 이것은 PostgreSQL의 9.5.1에 ​​있습니다.

    브라이언의 반응에 따라 당신은 쿼리의 소수를 제한하기 위해이 작업을 수행 할 수 있습니다. 나는 m / s로의 km / h로 변환하고 dygraphs에 표시하지만 dygraphs 그것을했을 때 그것은 이상한 보였다. 대신 쿼리에서 계산을 수행 할 때 외모는 미세. 이것은 PostgreSQL의 9.5.1에 ​​있습니다.

    select date,(wind_speed/3.6)::numeric(7,1) from readings;
    
  6. ==============================

    6.같은 숫자에 열을 주조하십시오 :

    같은 숫자에 열을 주조하십시오 :

    SELECT ROUND(cast(some_column as numeric),2) FROM table
    
  7. ==============================

    7.해결 방법 : 다음은 작동합니다 당신은 AddType 지정 캐스트 필요

    해결 방법 : 다음은 작동합니다 당신은 AddType 지정 캐스트 필요

    예 : 라운드 ((초) job_end_time_t에서 추출 :: 정수, 0)

  8. from https://stackoverflow.com/questions/13113096/how-to-round-an-average-to-2-decimal-places-in-postgresql by cc-by-sa and MIT license