일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Node.js
- dp
- 자바스크립트
- 문자열
- Crawling
- 알고리즘
- 그래프
- HTTP 완벽 가이드
- ip
- 쉬운 문제
- socket
- 타입 챌린지
- 프로그래머스 레벨 2
- 백준
- 가천대
- 타입스크립트
- dfs
- HTTP
- 소켓
- Nestjs
- Algorithm
- typescript
- javascript
- 프로그래머스
- TCP
- 수학
- BFS
- 레벨 1
- 크롤링
- type challenge
- Today
- Total
목록프로그래밍/SQL (8)
kakasoo
SELECT createdAt, LEAD(createdAt) OVER (ORDER BY createdAt) AS next_value FROM tableName; LEAD () OVER () 구문을 사용하면 서로 값이 교차하게끔 다음 번 값을 구할 수 있다. 1) 2023-06-13 23:48:34 2023-06-15 17:49:45 2) 2023-06-15 17:49:45 2023-06-15 17:50:49 3) 2023-06-15 17:50:49 2023-06-16 13:48:39 4) 2023-06-16 13:48:39 2023-06-16 13:51:47 5) 2023-06-16 13:51:47 2023-06-19 14:13:36 위 쿼리를 실행시켜 얻은 값인데, 이렇게 특정 테이블로부터 create..
우리 기업의 고객 수를 정확히 알고 싶다. 하지만 고객은 유입도 있고 이탈도 있어서, 특정 기간만을 봐서는 정확하게 집계할 수 없다. 따라서 고객은 여러 기간을 두고 봐야 하는데, 문제는 고객들 역시 패턴이 있다는 점이다. 지금 내가 소속된 회사같이 B2B라면, 고객들이 진출한 업계에 따라서 구매 패턴이 달라질 수가 있다. 예를 들어 스포츠나 레저 쪽 산업에 진출한 회사라면 당연히 계절마다 구매 패턴이 달라지게 될 것이다. 성장하는 회사라고 해도 직선의 그래프가 나오질 않으니 정확한 통계를 내려면 몇 년을 두고 봐야 할 텐데, 문제는 스타트업들의 경우에는 그 정도의 고객 데이터가 확보되지 않은 경우가 다반사라는 점이다. 어떻게 일부분의 데이터만 가지고도 전체 윤곽을 그려볼 수 있을까? Rolling wi..
유저의 배송지 테이블에 address(주소), addressDetail(상세 주소), userId(유저의 아이디) 칼럼이 존재한다. 다만 주소와 상세 주소를 각기 나눠서가 아니라, 하나로 합친 텍스트로 조회를 하고 싶다. 이럴 경우에 사용하는 것이 CONCAT 함수다. SELECT ab. "userId" AS "userId", CONCAT(oi.address, oi. "addressDetail") FROM address_book AS ab; 이 쿼리의 결과는 유저의 아이디와 합쳐진 주소 문자로 이루어진 두 칼럼을 반환한다. CONCAT 함수는 개수 제한 없이 파라미터를 받아, 파라미터를 모두 합친 문자열로 바꿔준다. 그래서 위처럼 두 개의 칼럼보다 더 많은 칼럼을 받을 수 있고, 또한 칼럼이 아닌 단순 ..
generate_series SELECT * FROM generate_series('2022-12-01'::date, '2022-12-31'::date, '1 day'::interval) AS "day" generate_series 는 연속적인 값들을 나타낼 때 사용하는 함수다. generate_series의 arguments는 start, stop, step으로 시작 값, 끝 값, 그리고 간격이다. SELECT * FROM generate_series(1, 10); -- 1,2,3,4,5,6,7,8,9,10 -- SELECT * FROM generate_series(1, 10, 2); -- 1,3,5,7,9 -- 여기서 시작 값과 끝 값을 넣어주고 간격을 입력하면 그 사이의 값들을 rows로 표현해준다..
TO_CHAR를 이용해 데이터를 원하는 문자열로 변경할 수 있지만, 이는 타입까지 바꿔버린다. 단순히 연도, 월, 날짜 등을 비교하기 위한 거라면 TO_CHAR는 너무 멀리 간 듯한 느낌이 있다. 이럴 때는 차라리 DATE_TRUNC 함수를 사용하는 것이 더 직관적이다. DATE_TRUNC 함수는 date나 timestamp 값을 특정한 단위까지 자르는 걸 도와주는 함수다. SELECT DATE_TRUNC('day', timestamp_column) as truncated_timestamp FROM table_name;
SELECT TO_CHAR(u. "createAt", 'yyyy-mm') FROM user_entity AS u; TO_CHAR를 이용할 경우 날짜를 원하는 형태로 변경할 수 있다. 필요에 따라 yyyy-mm-dd, yyyy-mm 등 여러 가지 형태로 변경할 수 있다. 데이터는 그 데이터 각각의 항들이 쌓인 시계열로 조회하거나 또는 그룹화하는 일들이 매우 빈번하기 때문에, TO_CHAR 와 같은 함수는 매우 유용하다. TO_CHAR에는 아래와 같은 옵션들을 지정할 수 있다. FM MM DD HH24 MI SS AM or PM 이것들을 어떻게 조합하는지에 따라, 원하는 형태로 timestamp 값을 변경할 수 있다. 즉슨 yyyymmdd 도 상관없고, 아예 기상천외하게 dd yyyy mm 와 같이 만들어버..
SQL을 작성하다보면 계속해서 반복되는 쿼리가 발생한다. sub query에서 outer query에 접근하지 못하거나, 그 외에도 많은 경우에 동일한 쿼리를 짜야할 때가 있다. 이런 동일 쿼리가 발생할 경우, 작성도 어렵거니와 쿼리를 수정할 때 반복된 모든 구간에서의 수정이 필요하다. 따라서 이런 쿼리를 더 쉽고 간편하게 작성하기 위해서, 변수와 같이 쿼리를 저장해둘 필요가 있다. 그럴 때 사용하는 것이 바로 WITH 문이다. WITH의 사용 예시 WITH cte AS ( SELECT column1, column2, column3 FROM table1 WHERE column1 = 'some value' ) SELECT * FROM cte WHERE column2 = 'another value'; 이런 ..
Postgresql에서 UNION ALL 문은 여러 개의 SELECT 쿼리를 하나의 결과 집합으로 바꾸는 역할을 한다. 만약 이게 불가능하다면 각각의 쿼리문을 작성한 다음, 매번 돌아가면서 호출을 해야 하는데, 이렇게 될 경우 데이터를 한 눈에 파악하기 어렵다. 따라서 아래와 같이 작성할 수 있다. SELECT column1, column2, ... FROM table1 WHERE condition UNION ALL SELECT column1, column2, ... FROM table2 WHERE condition 추가적으로 호출해서 데이터를 보고 싶은 게 있다면 UNION ALL 이후 SELECT 문을 작성하면 된다. 중복을 제거한 UNION SELECT column1, column2, ... FRO..