R에서 csv 파일 factor 별로 분할 저장하기

데이터는 아래와 같을 경우,

CUSTOMER_ID CAMPAIGN_ID
<chr> <chr>
1 cno0001 00010
2 cno0002 00010
3 cno0003 00010
4 cno0004 00010
5 cno0005 00011
6 cno0006 00011
7 cno0007 00012
8 cno0008 00012
9 cno0009 00012

 

1. 데이터 Import

library(readr)
dt <- read_csv(“R/파일명.csv”)

 

2. 분할 기준이 될 컬럼을 factor 데이터형으로 변경

dt$CAMPAIGN_ID <- as.factor(dt$CAMPAIGN_ID)

levels(dt_test$CAMPAIGN_ID)
## 변경 결과 확인

 

3.  분할 및 csv 저장

by(dt, dt[,c(“CAMPAIGN_ID”)], function(sub) {
fn <- paste0(‘캠페인번호-‘, sub$CAMPAIGN_ID[1], ‘.csv’)

write.csv(sub, fn, row.names=FALSE)
})

 

cf. 특정 컬럼만 저장하고 싶다면 다음과 같이 실행
write.csv(sub[c(1)], fn, row.names=FALSE)
})

 

→ 결과

캠페인번호-00010.csv
캠페인번호-00011.csv
캠페인번호-00012.csv

광고

PostgreSQL ROUND 함수 데이터형

PostgreSQL

ROUND function 시 데이터형을 명시해야 정확한 값이 나온다.

(예시)

SELECT ROUND((1412/231),2)
FROM 스키마.테이블;

--결과 : 6.00
SELECT ROUND((1412/231::numeric),2)
FROM 스키마.테이블;

--결과 : 6.12
SELECT round((1412::numeric/231),2)
FROM 스키마.테이블;

--결과 : 6.12
SELECT round((1412::numeric/231::numeric),2)
FROM 스키마.테이블;

--결과 : 6.12

비교 연산자(!=)와 NULL, 발생 가능한 실수

비교 연산자에서는 NULL이 배제된다.
(반면 논리 연산자에서는 NULL이 배제되지 않는다.)

 

가령,

Query 1.

SELECT *
FROM A FULL OUTER JOIN B ON ~
WHERE A.컬럼1 = ‘값1’ OR B.컬럼2 = ‘값2’

 

위 Query 1. 결과는 아래 Query 2.  결과와 일치하지 않는다.

 

Query 2.

SELECT *
FROM A FULL OUTER JOIN B ON ~
WHERE A.컬럼1 != ‘값1’ AND B.컬럼2 = ‘값2’

UNION

SELECT *
FROM A FULL OUTER JOIN B ON ~
WHERE A.컬럼1 = ‘값1’ AND B.컬럼2 != ‘값2’

(A, B의 컬럼 차수 및 데이터형은 일치한다고 가정한다)

 

A.컬럼1 과 B.컬럼2 의 NULL 값이 결과에서 배제되기 때문에
해당 컬럼의 NULL 존재 여부에 따라서 Query 2. 의 결과 수가 Query 1.보다 적을 수도 있다.

비교 연산자에서 NULL이 배제된다는 점을 고려했을 때,
Query1 과 동일한 결과를 도출하기 위해서 올바른 Query는 다음과 같다.

 

Query 3.

SELECT *
FROM A FULL OUTER JOIN B ON ~
WHERE A.컬럼1 = ‘값1’ AND (B.컬럼2 != ‘값2’ OR B.컬럼2 IS NULL)

UNION

SELECT *
FROM A FULL OUTER JOIN B ON ~
WHERE (A.컬럼1! = ‘값1’ OR A.컬럼1 IS NULL) AND B.컬럼2 = ‘값2’

(A, B의 컬럼 차수 및 데이터형은 일치한다고 가정한다)

 

결론 : 비교 연산자와 논리 연산자를 함께 사용할 경우, NULL 처리에 유의하자!

GROUP BY 절의 ALIAS 사용 제한 시 대안

GROUP BY 절

  1. GROUP BY 절을 통해 소그룹별 기준을 정한 후, SELECT 절에 집계 함수를 사용한다.
  2. 집계 함수의 통계 정보는 NULL 값을 가진 행을 제외하고 수행한다.
  3. GROUP BY 절에서는 SELECT 절과는 달리 ALIAS 명을 사용할 수 없다.
  4. 집계 함수는 WHERE 절에는 올 수 없다. (집계 함수를 사용할 수 있는 GROUP BY 절보다 WHERE 절이 먼저 수행된다)
  5. WHERE 절은 전체 데이터를 GROUP으로 나누기 전에 행들을 미리 제거시킨다.
  6. HAVING 절은 GROUP BY 절의 기준 항목이나 소그룹의 집계 함수를 이용한 조건을 표시할 수 있다.
  7. GROUP BY 절에 의한 소그룹별로 만들어진 집계 데이터 중, HAVING 절에서 제한 조건을 두어 조건을 만족하는 내용만 출력한다.
  8. HAVING 절은 일반적으로 GROUP BY 절 뒤에 위치한다.

 

☞ 대안 :

특수한 상황에 의해 반드시 ALIAS를 GROUP BY 절에 사용해야할 경우,

      FROM 절에 Inline View를 생성 →  별칭을 제거 →  GROUP BY 실행

 

 

PostgreSQL 과 R 연결하기 (R Studio)

R Studio에서 다음 코드 실행

> install.packages(“DBI”)

> install.packages(“odbc”)

> install.packages(“RPostgreSQL”)

# 설치
> require(“RPostgreSQL”)

>con<-dbConnect(dbDriver(“PostgreSQL”), dbname=”dbname“, host=”localhost”, port=5432, user=”user_name“,password=”password“)

> dbListTables(con)
# 접속

 

출처 : https://stackoverflow.com/questions/40642657/connecting-r-to-postgresql-database

국가공인 SQL 개발자 자격증 취득

자 격 번 호 : SQLD – 0310126
합 격 일 자 : 2018년 12월 28일
유 효 기 간 : 2018.12.28 ~ 2020.12.27
시험 범위 중 데이터 모델링 파트가 난이도가 있었다.
’19년 하반기나 내후년 중 여유가 있으면 SQL 전문가 자격증도 취득할 생각이다.

PostgreSQL 다른 user로 접속 설정 (Windows 10)

1. pg_hba.conf 파일 수정
경로 : path\PostgreSQL\11\data
수정 내용 : 아래 레코드 추가 (빨간색)postgresql pghbaconfig.png

*구체적인 METHOD 에 대해서는 다음 링크 참조

 

2. user 생성 (pgAdmin4)

pgAdmin4 > Tree Control > Server > Login/Group Roles > Create

postgresql create user.png

user 정보 입력
postgresql create user def

*user password 변경 필요 시 다음 쿼리 사용
ALTER USER user_name WITH PASSWORD ‘password‘;

 

3. 고정 IP 설정
시작 > cmd > ipconfig/all
위 경로에서 보여지는 IP 관련 정보를 아래에 입력
네트워크 및 인터넷 > 설정 > 속성 > 수동

 

참고
https://www.postgresql.org/docs/11/auth-pg-hba-conf.html

 

PostgreSQL Data type

  1. Boolean
    1. True
    2. False
    3. NULL
  2. Character
    1. Char(n)
    2. Varchar(n)
    3. Text : 문자길이 제한이 없음
  3. Number
    1. Integers
      1. Small integer (smallint)
      2. Integer (int)
      3. Serial
    2. Floating-point number
      1. Float(n)
      2. Real or Float8
      3. Numeric or Numeric(p,s)
  4. Temporal Data Type
    1. Date : date value only
    2. Time : day value
    3. Timestamp : date + time
    4. Interval : periods of time
    5. Timestamptz : timestamp + time zone data
  5. Special Data Type
    1. Box : a rectangular box
    2. Line : a set of points
    3. Point :  a geometric pair of numbers
    4. Lseg : a line segment
    5. Polygon : a closed geometric
    6. Inet : an IP4 address
    7. Macaddr :a  MAC address
  6. Arrays Data Type

 

출처 : https://www.youtube.com/watch?v=aUfPf-clLLs

ROLL UP 활용한 개수 및 비율 구하기

테이블 내 집계 관련 파생속성이 주어지지 않았을 때 아래 SQL문은 유용하다.

 

SELECT CASE WHEN 컬럼1 IS NULL THEN ‘총계’ ELSE 컬럼1 END ‘컬럼명, ROUND(COUNT(*) “개수”, 200*COUNT(*)/SUM(COUNT(*))OVER(),2) “비율”
FROM (SELECT NVL(컬럼, ‘NULL’) 컬럼1 FROM 테이블)
GROUP BY ROLLUP(컬럼1)
ORDER BY CASE ~

 

tip1. 200을 곱하는 이유는 ROLLUP 때문이다.
tip2. 인라인뷰에서 NVL 처리를 해주는 것이 ROLLUP 총계 표시를 위해 바람직하다.