단순하게 하면 되는줄 알았는데 단순한 애가 아니었네...

 

suppliers를 SUPER SET 이라고 정의하고

subquery의 orders를 SUB SET이라고 정의하면

 

suppliers를 A orders 를 B라고 정의하면

NOT EXISTS는 A-B 차집합 결과를

EXISTS는 A∩B교집합 결과를 돌려준다.

조금은.. WHERE IN과 다르게 비교 조건이 subquery에 들어가는 느낌이라고 해야하려나?

대신.. NOT IN으로 하면 결과가 30분 넘게 걸리는게 몇초도 안되서 바로 결과가 나오니 좋다.

SELECT *

  FROM suppliers

 WHERE NOT EXISTS (SELECT * FROM orders

                            WHERE suplliers. supplier_id = orders.supplier_id);

[링크 : https://20140501.tistory.com/57]

Posted by 구차니

집계 함수를 창 함수로 사용하기 위해서는 filter() over()가 끼면 되는 듯

 

The filter clause works for any aggregate function: besides the well-known functions such as sum and count, it also works for array_agg and ordered set functions (e.g., listagg).

>> filter 절은 어떠한 aggregate 함수와도 사용이 가능함: ...

If an aggregate function is used as a window function (over clause), the syntactic order is: aggregate function, filter clause, over clause:

>> 만약 aggregate 함수가 window 함수로 사용이 되어진다면  (over 절), 문법적 순서는 aggregate, filter, over 순으로 된다.

SUM(<EXPRESSION>) FILTER(WHERE <condition>)

SUM(...) FILTER(WHERE ...) OVER (...)

[링크 : https://modern-sql.com/feature/filter]

 

order by, group by 서브쿼리를 개선하기 위해 나온 함수

[링크 : https://javaexpert.tistory.com/503]

Posted by 구차니

aggregate - count(), avg(), sum(), min(), max()

group - 소계, 중계 합계

 > rollup() 그룹핑된 컬럼의 소계를 생성

 > grouping() , group by rollup()

 > group by  cube()

window - rank(), row_number()

[링크 : https://jeong-pro.tistory.com/41]

 

윈도우 함수

분석함수(analytic function) 혹은 순위함수(rank function)

데이터 웨어하우스에서 발전한 기능

[링크 : https://eehoeskrap.tistory.com/79]

[링크 : https://gaiag.tistory.com/27]

Posted by 구차니

예전에 적어둔게 없었나..

아무튼.. ALTER SEQUENCE를 통해 RESTART WITH 뒤에 원하는 숫자를 넣어주면 해당 숫자로 시작을 다시 한다.

(예전 기억으로는 0은 안되고 1부터 시작했던 걸로 기억함.)

 

ALTER SEQUENCE "시퀀스이름" RESTART WITH 1

[링크 : https://gs.saro.me/dev?page=2&tn=5]

Posted by 구차니

SQL 문을 통해 이것저것 조인을 하다 보면

예상하지 못하게 이상하게 갯수가 많이 늘어가는 경우가 발생한다.

대개(?)는 1:1 조건인줄 알았던 테이블이 예상외로 1:N 조건이기 때문에 발생을 하는데

 

ROW_NUMBER() OVER(PARITION BY)를 이용하여 left join 결과를 정렬후

상위 쿼리에서(즉 LEFT_JOIN은 서버 쿼리에서 수행) ROW_NUMBER = 1인 조건으로 걸러내면 될 듯 하다.

 

일단 해보진 않았으니 패스~ 이론적으로만 알아둬야지.. 끄응

 

SELECT
    A.PersonName, A.Email
FROM
        (
        Select Person.PersonName, Email.Email
            ,ROW_NUMBER() OVER(PARTITION BY Person.ID ORDER BY Email.Email) AS RN
        From person 
        left join Email on Person.ID=Email.PersonId
        ) A
WHERE A.RN = 1

[링크 : https://dba.stackexchange.com/questions/103815...]

[링크 : https://stackoverflow.com/questions/3375436/how-do-i-limit-a-left-join-to-the-1st-result-in-sql-server]

 

+

UPDATE 쿼리에서 join을 통해 할 경우에도

아마도.. 물리적으로 배열된 컬럼중에 가장 위에것이 되지 않겠냐 라는 답변이 있는데

반대로 생각하면 할때 마다 다른 결과가 나올수도 있다.. 라는 의미가 된다.

[링크 : https://stackoverflow.com/questions/9502449/updating-and-join-on-multiple-rows-which-rows-value-is-used]

'프로그램 사용 > postgreSQL' 카테고리의 다른 글

sql 표준함수 종류  (0) 2019.12.09
postgresql 시퀀스 값 초기화 하기  (0) 2019.11.29
array_agg 빈 배열을 누적할 수 없습니다.  (0) 2019.11.28
sql over() partition by  (0) 2019.11.28
pg_tables, pg_sequences  (0) 2019.11.28
Posted by 구차니

하나는 들어있고 다른 하나는 비어있는 걸 합치려고 하니 에러가 나서

찾아보니 그냥 함수를 만들어 버린듯 

CREATE AGGREGATE array_accum (anyarray)
(
    sfunc = array_cat,
    stype = anyarray,
    initcond = '{}'
);  


[링크 :
https://gist.github.com/ryandotsmith/4602274]]

[링크 : https://codeday.me/ko/qa/20190625/887424.html]

Posted by 구차니

분석함수를 나타내는거 over()

partition by는 계산 대상 그룹을 지정하고.. 라는데 무슨 말인지 이해가 안된다..

[링크 : http://www.gurubee.net/lecture/2671]

[링크 : https://syoons.tistory.com/8]

[링크 : https://brownbears.tistory.com/310]

 

곰곰히 생각해보니.. 여러개 쿼리로 일일이 조건을 줘서 통계를 내야 할 걸

한줄에 편리하게 하는 것일 뿐인가?

select *
from(
   select code, date, account, upd_date,

   max(upd_date) over (partition by code, date) as maxdate from hoge

) t1
where t1.upd_date = t1.maxdate;

[링크 : https://javafactory.tistory.com/1343]

 

+

편하게 쓰려고 만들었다 라는 말이 맞는게

group by는 전체 쿼리에 적용

partition by는 window function 으로 작동

[링크 : https://stackoverflow.com/questions/2404565/sql-server-difference-between-partition-by-and-group-by]

Posted by 구차니

좀 대량으로 지울일이 있어서 pgadmin으로 하려니 일일이 클릭해야 해서 대략 빡침 시전

그러다가 psql 가서 하려니..

크아아 public schema가 아니라 바로 안나오네?!?!

 

그래서 고민 때리다 검색해보니

[링크 : https://stackoverflow.com/questions/4202135/how-to-drop-multiple-tables-in-postgresql-using-a-wildcard]

 

pg_tables와 pg_sequences에서 테이블 명을 검색해서 뽑아낼수 있어

그걸 이용해서 drop table, drop sequence를 해버리니 편하네

'프로그램 사용 > postgreSQL' 카테고리의 다른 글

array_agg 빈 배열을 누적할 수 없습니다.  (0) 2019.11.28
sql over() partition by  (0) 2019.11.28
pgcrypt encrypt() aes cbc ecb 그리고 padding  (0) 2019.11.25
sql TO_CHAR()  (0) 2019.11.23
sql where like %와 _  (0) 2019.11.22
Posted by 구차니

일단~은

AES/CBC/PKCS5PADDING이 기본이라고 보면 될 듯?

 

Encrypt/decrypt data using the cipher method specified by type. The syntax of the type string is:

where algorithm is one of:

  • bf — Blowfish

  • aes — AES (Rijndael-128, -192 or -256)

and mode is one of:

  • cbc — next block depends on previous (default)

  • ecb — each block is encrypted separately (for testing only)

and padding is one of:

  • pkcs — data may be any length (default)

  • none — data must be multiple of cipher block size

[링크 : https://www.postgresql.org/docs/9.6/pgcrypto.html]

'프로그램 사용 > postgreSQL' 카테고리의 다른 글

sql over() partition by  (0) 2019.11.28
pg_tables, pg_sequences  (0) 2019.11.28
sql TO_CHAR()  (0) 2019.11.23
sql where like %와 _  (0) 2019.11.22
split_part() 에서 나눠지지 않을 경우 없는 막기  (0) 2019.11.15
Posted by 구차니

어떻게 보면.. sprintf 역활을 하는 함수라고 하면 되려나?

특정 자릿수로 제한하거나 공백에 0을 채우거나 할때

 

SELECT TO_CHAR(value, '00000')

이렇게 하면 value가 5자리를 넘지 않을 경우

00001~99999 까지 자릿수 유지하면서 출력한다.

[링크 : https://www.postgresql.org/docs/9.3/functions-formatting.html]

Posted by 구차니