본문 바로가기

MySQL15

[MySQL] date_trunc 함수를 구현하자. date_trunc 라는 함수는 특정일자의 시작이 되는 unit 의 첫날을 가져오는 함수이다. 예를 들면 date_trunc('week', '2022-08-05') 라고 하면 2022년 8월 5일이 있는 주(unit) 의 첫날인 '2022-08-01' 보여준다. date_trunc('month', '2022-04-25') 라고 하면 2022년 4월 25일이 있는 월(unit) 의 첫날인 '2022-04-01'을 출력한다. 그런데 MySQL 에서는 안타깝게도 date_trunc 함수를 지원하지 않는다. 월의 첫날은 date_trunc 함수를 사용하지 않아도 구하는 것이 어렵지는 않지만, 주의 첫날을 구하는 것은 까다로울 수 있다. 그래서 아래와 같이 응용을 하여 구해볼 수 있다. select STR_TO_.. 2022. 8. 17.
[SQL] 기하평균 을 구해보자 이전 포스팅에서는 기하평균의 의미와 함께 엑셀(Excel)을 사용하여 데이터를 검증해보았다. https://walkingfox.tistory.com/173 곱의 평균 (기하평균) 위의 차트는 어느 신문기사에서 가져온 경제성장률에 대한 내용이다. 2009년부터 2020년까지 12년동안 경제 성장률이 변화무쌍하다. 그럼 위 12년동안 평균 경제 성장률은 어떻지? 라는 물음에 답 walkingfox.tistory.com 이번 포스트에서는 기하평균을 SQL 에서 구하는 방법을 살펴보도록 한다. 테이블에 아래와 같은 id, rate 이라는 두 컬럼으로 구성된 list 라는 테이블이 있다고 가정을 한다. 여기서 산술평균은 avg 라는 함수를 사용하여 쉽게 구할 수 있다. 기하평균의 경우 athena 또는 prest.. 2022. 7. 26.
[SQL] 주단위 집계 꼭!! 주의해야할 점 (presto, athena) 이전 포스팅에서는 mysql 에서 주단위 집계시에 주의해야 할 점에 대해서 이야기 했었다. https://walkingfox.tistory.com/159 [MySql] 주단위 집계 꼭!! 주의해야할 점 쿼리(Query) 작업 시에 주 (Week) 단위로 집계를 해야한다면, 꼭 주의해야할 점이 하나 있다. 그것은 특정 일자가 어느 주에 속하는지에 따라서 다른년도의 주로 잘 못 계산되는 경우가 무척 많기 때 walkingfox.tistory.com 이번 글에서는 같은 내용을 presto 나 athena 에서 어떻게 처리할 지 이야기 해보겠다. presto 에서도 mysql에서와 같이 case when 구문을 이용하면 비슷한 방식으로 처리할 수 있지만, 역시나 sql 문장이 장황하게 길어진다. 대신 prest.. 2022. 6. 3.
[SQL] 주단위 집계 꼭!! 주의해야할 점 (MySql) 쿼리(Query) 작업 시에 주 (Week) 단위로 집계를 해야한다면, 꼭 주의해야할 점이 하나 있다. 그것은 특정 일자가 어느 주에 속하는지에 따라서 다른년도의 주로 잘 못 계산되는 경우가 무척 많기 때문이다. 특히 연의 마지막주와 연의 첫번째 주에서 이 오류를 자주 범하게 된다. 주 번호 (week number) 를 계산하는 방식에는 여러 가지가 있는데, 예를 들어서 매주 월요일이 있는 날짜의 주를 해당 주의 기준으로 본다고 하면, 위 달력에서 22년도 1월 1일과 22년도 1월 2일은 21년도의 52번째 주에 포함이 된다. 즉, 22년 1월 3일부터 22년도 첫번째주 (01주)가 되는 것이다. 그리고 반대의 경우도 발생할 수 있다. 특정 연도의 12월 30일 또는 31일이 다음 년도의 첫번째 주에 .. 2022. 5. 16.
[MySQL] Shell 에서 쿼리 결과를 CSV 파일로 저장 DB에 쿼리를 할 때 보통은 DB 클라이언트 프로그램을 사용한다. Workbench, DBeaver 와 같은.. 그러면 해당 툴에서는 쿼리의 결과를 쉽게 csv 파일로 저장을 할 수 있다. 하지만, 경우에 따라서 위 처럼 툴(tool)에서 쿼리 결과를 받을 수 없는 경우가 있을 수 있는데 이때는 Shell 에서 명령어로 그 결과를 CSV 로 저장할 수 있다. 아래와 같이... mysql -u"계정명" -p "DB명" "결과파일명" $ mysql -uroot -p test_db result.csv 각 항목마다 " " 로 감싸지 않을 경.. 2022. 5. 11.
Mysql 샘플링 (Sampling) : 랜덤 추출 Mysql 에서 랜덤(무작위)으로 몇개의 데이터를 추출하는 경우에 사용할 수 있는 쿼리 문장이다. order by 절에 rand() 함수를 적용하면 데이터가 랜덤한 순서로 추출이되면 limit 절로 그 갯수를 정하는 방식이다. Select * From tb_sample Order by rand() Limit 100 위의 쿼리는 tb_sample 이라는 테이블에서 랜덤으로 100개의 raw 를 추출하는 쿼리문장이며, 필요에 따라서 Where 절을 추가할 수 있다. Where 절이 추가되면, 조건이 적용된 데이터중에서 랜덤하게 100개를 추출한다. 2022. 4. 6.
MySQL 날짜/시간 함수 mysql 날짜/시간 함수 정리 -- 현재시간 날짜 구하기 select now(), current_date, current_time -- 날짜 더하고 빼기 select now(), date_add(now(), interval 1 day) select now(), date_add(now(), interval 4 hour) select now(), date_sub(now(), interval 1 day) select now(), date_sub(now(), interval 4 hour) -- 두 시간의 차이 select timestampdiff(MONTH, now(), date_add(now(), interval 4 month)) 시간주기에 아래의 단위를 사용할 수 있다. SECOND : 초 MINUTE :.. 2022. 3. 29.
자동로그인, Mysql : Login-path 1. 개요 mysql을 command line에서 로그인을 하려면 "mysql -u 로그인명 -p DB명" 이런식으로 입력하고, 바로 패스워드를 묻고 입력하면 로그인이 된다. 그러나 shell script 등에서 이용하려면 pw 입력때문에 사용하기가 불편해진다. 또는 위의 커맨드에 pw를 노출해야한다. 이럴때에 자동으로 로그인을 할 수 있도록 하는 명령이 바로 login-path 이다. 2. 생성 $ mysql_config_editor set --login-path=설정이름 --host=주소 --user=아이디 --port=포트 --password Enter password: ***** 3. 확인 $ mysql_config_editor print --login-path=설정이름 [myroot] user .. 2020. 2. 17.
Mysql에서 rownum 과 그룹별 rownum 이런 table이 있다고 가정하자 name : scores column : class, name, score class (반), name(학생이름), score(점수) 하고자 하는 작업은 각 반별로 상위 점수 3명을 구하는 것이다. 1. rownum mysql에서는 rownum을 제공하지 않기 때문에 다음과 같이 해서 구할 수 있다. select class, name, score, @rownum:=@rownum+1 as rownum from scores, (select @rownum:=0) r 2. rownum by group : 그룹별로 rownum을 만들어 보자 -- group 별 rownum select class, name, score , case when @grp = class then @row.. 2019. 8. 8.