DB
-
[PostgreSQL] COALESCE, NULLIF, SIGN, IS DISTINCT FROMDB/PostgreSQL 2021. 2. 28. 19:41
COALESCE와 NULLIF 두 함수는 유사한 동작을 하는 것 같지만 실제로는 다른 결과를 유발합니다. COALESCE COALESCE(X, Y)는 첫 파라미터인 X가 NULL이라면 Y를 반환하고 그렇지 않으면 X를 반환합니다. select coalesce(null, '123'); -- '123' select coalesce('1', '123'); -- '1' NULLIF NULLIF(X, Y)는 X와 Y가 같다면 NULL을 반환하고 그렇지 않으면 X를 반환합니다. select nullif('1', '1'); -- null select nullif('1', '2'); -- 1 select nullif(null, null); -- null SIGN 입력된 값이 양수면 1, 0이면 0, 음수면 -1을 반환..
-
[PostgreSQL] CUBE문을 사용해 사용자 액션 집계하기DB/PostgreSQL 2021. 2. 28. 18:51
먼저 사용자들의 액션 플래그를 집계하는 쿼리를 다음과 같다고 가정합니다. WITH action_flag AS ( SELECT user_id, SIGN(SUM(CASE WHEN action = 'purchase' THEN 1 ELSE 0 END)) AS has_purchase, SIGN(SUM(CASE WHEN action = 'review' THEN 1 ELSE 0 END)) AS has_review, SIGN(SUM(CASE WHEN action = 'favorite' THEN 1 ELSE 0 END)) AS has_favorite FROM action_log GROUP BY user_id ) SELECT * from action_flag 이러한 결과는 다음과 같습니다. user_id has_purch..
-
[PostgreSQL] ROLLUP을 사용해 소계 구하기DB/PostgreSQL 2021. 2. 28. 17:15
먼저 아래와 같은 데이터가 있다고 가정합니다. dt order_id user_id item_id price category sub_category 2017-01-01 1 1 1 10000 men jacket 2017-01-01 1 1 2 5000 food fish 2017-01-01 1 1 3 2500 book business 2017-01-01 2 2 1 10000 men jacket 2017-01-01 2 2 5 50000 women bag 2017-01-01 3 2 2 5000 food fish 2017-01-01 4 3 1 10000 men jacket 2017-01-01 5 4 4 40000 cd classic 이러한 데이터에서 카테고리별 총 매출과 소계를 계산하고자 합니다. 소계란 전체가 아닌..
-
[PostgreSQL] window function의 window frame 알아보기DB/PostgreSQL 2021. 2. 27. 21:59
window function에 관해서는 https://brownbears.tistory.com/310 에서 설명이 되어 있습니다. window function의 사용예제를 보다 보면 BETWEEN 구문이 들어가 있는 것을 확인할 수 있습니다. 이를 window frame 즉, 프레임 지정 구문이라 합니다. 프레임 지정이란 현재 레코드 위치를 기반으로 상대적인 window를 지정하는 구문입니다. 프레임 지정 구문은 {범위} BETWEEN {시작} AND {종료} 또는 {범위} {시작} 형태입니다. 시작, 종료 시작과 종료에는 다음과 같은 키워드를 조합하여 사용할 수 있습니다. CURRENT ROW: 현재 행 n PRECEDING: n행 앞 n FOLLOWING: n행 뒤 UNBOUNDED PRECEDING..
-
[PostgreSQL] with문으로 공통 테이블 식 (CTE) 사용하기DB/PostgreSQL 2021. 2. 27. 21:09
CTE는 Common Table Expression으로 간단하게 쿼리 결과를 일시적으로 저장하여 테이블처럼 사용하는 것입니다. PostgreSQL에서는 with구문을 사용해 구현할 수 있습니다. WITH temp_query_result AS ( SELECT category_name, product_id, sales, row_number() over (PARTITION BY category_name ORDER BY sales DESC) AS rank FROM product_sales ) SELECT * FROM temp_query_result; with문은 조회 결과 뿐만 아니라 values 구문을 사용해 유사 테이블을 만들 수 있습니다. WITH device(id, device) AS ( VALUES (..
-
[PostgreSQL] JSON type 사용하기DB/PostgreSQL 2020. 6. 7. 16:40
json과 jsonb 타입PostgreSQL에서는 JSON 형식을 필드로 선언해 저장할 수 있습니다. 관련 타입은 json, json[], jsonb, jsonb[] 으로 4가지가 있습니다. 여기서 jsonb 라는 타입을 볼 수 있는데 json과 jsonb의 차이점은 입력된 값 그대로를 저장할 것인지 최적화된 값을 저장할 것인지 입니다.json 타입은 입력된 공백, 키 순서, 중복 등과 같은 모든 것을 그대로 저장합니다. 저장 이후 질의를 한다고 가정하면 json blob을 질의할 때마다 로드하고 구문을 분석하기 때문에 속도가 느린 단점이 있습니다.그에 반해 jsonb는 json blob의 줄임말로 입력된 값을 질의에 최적화된 형태로 저장합니다. 따라서 키의 순서, 중복 제거, 공백 제거 등이 발생해 초..
-
[Elasticsearch] DSL 살펴보기DB/Elasticsearch 2019. 12. 1. 17:53
DSL이란 Domain Specific Language 으로 JSON에 기반한 질의입니다. ES에서의 DSL은 데이터베이스의 SQL문과 동일하다고 이해하면 쉽습니다. 사용자가 원하는 데이터를 추출하기 위한 질의 언어입니다. 아래는 Elastic search에 질의를 하여 원하는 데이터를 추출하기 위한 DSL 예시입니다. 기본적으로 질의를 위해선 아래와 같이 "query" 속성을 사용합니다.GET /조회할 인덱스명/_search/ { "query": { ... } }Query VS FilterDSL 기능이 어떤게 있는지 설명에 앞서 query와 filter간 차이점을 먼저 설명합니다.기본적으로 Elastic search는 일치하는 검색 결과의 관련성을 점수 별로 정렬하여 각 문서가 쿼리와 얼마나 잘 일치하..
-
[PostgreSQL] array (list) 타입 관련 함수DB/PostgreSQL 2019. 1. 19. 17:57
array 데이터를 각 로우로 변경unnest(array타입) -- 예시 select unnest(ARRAY[1,2]) 1 2 (2 rows)array 타입에 데이터 추가array_append(array, 값) -- 예시 array_append(ARRAY[1,2], 3) {1,2,3}array 타입끼리 협차기array_cat(array, array} -- 예시 array_cat(ARRAY[1,2], ARRAY[3,4]) {1,2,3,4}array에서 string(단일컬럼)으로 변경array_to_string(array, 구분자, [NULL 값 대체 구분자]) -- 예시 array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '*') 1,2,3,*,5string을 array로 변..
-
샤딩(sharding), 파티셔닝(partitioning)DB 2018. 12. 23. 16:14
샤딩(sharding)과 파티셔닝(partitioning)의 차이파티셔닝이란 퍼포먼스(performance), 가용성(availability) 또는 정비용이성(maintainability)를 목적으로 논리적인 데이터 엘리먼트들을 다수의 table로 쪼개는 행위를 뜻하는 일반적인 용어입니다.샤딩은 수평 파티셔닝(horizontal partitioning)과 동일합니다. 데이터베이스를 샤딩하게 되면 기존에 하나로 구성될 스키마를 다수의 복제본으로 구성하고 각각의 샤드에 어떤 데이터가 저장될 지를 샤드 키를 기준으로 분리합니다. 수평 파티셔닝 (horizontal partitioning) = 샤딩 위 예시를 보면 1 ~ 5 번 고객의 정보는 하나의 샤드에 저장하고 6 ~ 10 번 고객의 정보는 다른 샤드에 저..