π PostgreSQL κΈ°λ³Έ 12 - λ μ§μ μκ°μ μ¬μ©ν μμ
π
γμ€μ© SQLγμ μ½κ³ μ 리ν κΈμ λλ€.
λ μ§ λ° μκ°μ λν λ°μ΄ν° νμ κ³Ό ν¨μ μ΄ν΄νκΈ°
- λ€μμ λ μ§ λ° μκ° κ΄λ ¨ λ°μ΄ν° νμ μ΄λ€.
timestamp- λ μ§μ μκ°μ κΈ°λ‘νλ€.
- νμ€ μκ°λλ₯Ό ν¬ν¨ν΄ μκ°μ μ μ₯νκ³ μΆλ€λ©΄
with time zoneν€μλλ₯Ό μΆκ°ν΄μΌ νλ€. timestamp with time zoneνμμSQLνμ€μ μΌλΆμ΄λ©°,PostgreSQLμλ κ·Έμ λμΌν λ°μ΄ν° νμ μΈtimestamptzκ° μλ€.- νμ€ μκ°λλ
UTCμ€νμ , μμ/μμΉ μ§μ μ, λλ νμ€ μ½μ΄λΌλ μΈ κ°μ§ νμμΌλ‘ μ§μ ν μ μλ€. - μκ°λκ° μλ μκ°μ
timestamptzμ΄μ μ 곡ν κ²½μ° λ°μ΄ν°λ² μ΄μ€λ μλ²μ κΈ°λ³Έ μ€μ μ μ¬μ©νμ¬ μκ°λ μ 보λ₯Ό μΆκ°νλ€.
date- λ μ§λ§ κΈ°λ‘νλ©°,
SQLνμ€μ μΌλΆλ€. with time zoneν€μλλ₯Ό μ¬μ©νλ©΄ μ¬λ¬ λ μ§ νμμ μ¬μ©ν μ μλ€.- λ μ§λ₯Ό νμνλ €λ©΄
ISO 8601κ΅μ νμ€ νμμ΄μPostgreSQLκΈ°λ³Έ μΆλ ₯μΈYYYY-MM-DDν¬λ§· μ¬μ©μ΄ κΆμ₯λλ€. ISOνμμ μ¬μ©νλ©΄ λ°μ΄ν°λ₯Ό κ΅μ μ μΌλ‘ 곡μ ν λ νΌμ μ λ°©μ§ν μ μλ€.
- λ μ§λ§ κΈ°λ‘νλ©°,
time- μκ°λ§ κΈ°λ‘νλ©°,
SQLνμ€μ μΌλΆλ€. with time zoneν€μλλ₯Ό μ¬μ©νλ©΄ μ΄μμ μκ°λλ₯Ό μΈμνμ§λ§, λ μ§κ° μμΌλ©΄ μκ°λλ μλ―Έκ° μλ€.- μ΄ μ μ κ³ λ €νλ©΄
with time zoneν€μλλtimestapmtzλ μ¬μ©νμ§ μλ κ²μ΄ μ’λ€. ISO 8601νμμHH:MM:SSμ΄κ³ μκ°, λΆ, μ΄λ₯Ό λνλΈλ€.
- μκ°λ§ κΈ°λ‘νλ©°,
intervalquantity unitνμμΌλ‘ ννλ μκ° λ¨μλ₯Ό λνλ΄λ κ°μ 보μ νλ€.12 daysλ8 hoursμ κ°μ΄ κΈ°κ°λ§ κΈ°λ‘νλ€.SQLνμ€μ μΌλΆμ§λ§,PostgreSQLμ μ© κ΅¬λ¬Έμ λ λ§μ μ΅μ μ μ 곡νλ€.
- μΈ λ°μ΄ν° νμ
date,time,timestamp with time zoneμdatetimeνμ μ΄λΌκ³ λΆλ₯΄λ©°, κ·Έ κ°μdatetimesλΌκ³ νλ€. intervalνμ μ κ°μintervalsλΌκ³ νλ€.
λ μ§μ μκ° μ‘°μνκΈ°
- λ μ§ λ° μκ° λ°μ΄ν° νμ
, ꡬ문, ν¨μ λ±μ λ°μ΄ν°λ² μ΄μ€μ λ°λΌ
SQLνμ€μμ λ²μ΄λλ κ²½μ°κ° λ§μΌλ―λ‘ μ£Όμν΄μΌ νλ€.
νμμ€ν¬ν κ°μ κ΅¬μ± μμ μΆμΆνκΈ°
1
2
3
4
5
6
7
8
9
10
11
SELECT
date_part('year', '2022-12-01 18:37:12 EST'::timestamptz) AS year,
date_part('month', '2022-12-01 18:37:12 EST'::timestamptz) AS month,
date_part('day', '2022-12-01 18:37:12 EST'::timestamptz) AS day,
date_part('hour', '2022-12-01 18:37:12 EST'::timestamptz) AS hour,
date_part('minute', '2022-12-01 18:37:12 EST'::timestamptz) AS minute,
date_part('seconds', '2022-12-01 18:37:12 EST'::timestamptz) AS seconds,
date_part('timezone_hour', '2022-12-01 18:37:12 EST'::timestamptz) AS tz,
date_part('week', '2022-12-01 18:37:12 EST'::timestamptz) AS week,
date_part('quarter', '2022-12-01 18:37:12 EST'::timestamptz) AS quarter,
date_part('epoch', '2022-12-01 18:37:12 EST'::timestamptz) AS epoch;
- μ λͺ
λ Ήλ¬Έμ
date_part()λ₯Ό μ¬μ©νμ¬timestampκ°μ κ΅¬μ± μμλ₯Ό μΆμΆνλ 쿼리λ€. - ν΄λΉ ν¨μμ 첫 λ²μ§Έ μΈμμλ λ μ§ λλ μκ° λΆλΆμ λνλ΄λ ν
μ€νΈκ° λ€μ΄κ°κ³ , λ λ²μ§Έ μΈμμλ
date,time,timestampκ°μ΄ λ€μ΄κ°λ€. - κ²°κ³Όλ λ€μκ³Ό κ°λ€.
| year | month | day | hour | minute | seconds | tz | week | quarter | epoch |
|---|---|---|---|---|---|---|---|---|---|
| 2,022 | 12 | 2 | 8 | 37 | 12 | 9 | 48 | 4 | 1,669,937,832 |
tzμ΄μUTC(νμ μΈκ³μ)λ‘λΆν° μκ° μ°¨μ΄ λλ μ€νμ μ λ³΄κ³ νλ€.- κ°λ Ή μ κ²°κ³Όλ
UTCλ³΄λ€ 9μκ° μ΄λ₯Έ μκ°λλ₯Ό μ§μ νλ€.
μκ°λμμ
UTCμ€νμ μ μ λν μλ μμ§λ§ κ·Έ λ°λμ κ²½μ°λ λΆκ°λ₯νλ€. κ°UTCμ€νμ μ μ¬λ¬ λͺ λͺ λ μκ°λμ νμ€ λ° μΌκ΄ μ μ½ μκ° λ³νμ μ°Έμ‘°ν μ μλ€.
weekμ΄μ 2022λ 12μ 2μΌμ΄ ν΄λΉ μ°λμ 48λ²μ§Έ μ£Όμ ν΄λΉν¨μ 보μ¬μ€λ€.quarterμ΄μ ν΄λΉ λ μ§κ° μ¬ν΄ 4λΆκΈ°μ μν¨μ μ μ μλ€.epochμ΄μ μ»΄ν¨ν° μμ€ν κ³Ό νλ‘κ·Έλλ° μΈμ΄μμ μ¬μ©λλ μΈ‘μ κ°μ λνλ΄λλ°,UTC0μΈ 1970λ 1μ 1μΌ μ€μ 12μ μ΄μ λλ μ΄νλ‘ κ²½κ³Όλ μκ°μ μ΄ λ¨μλ‘ λ³΄μ¬μ€λ€.
μ λμ€ μκ°μ μ£Όμνμ.
PostgreSQLμdate_part()λdouble precisionνμ μΌλ‘ μ λμ€ μκ°μ λ°ννλ€.double precisionνμ μ λΆλ μμμ μ΄λΌ κ³μ° μ μ€μ°¨κ° λ°μνκΈ°λ νλ€. λν μ λμ€ μκ°μ μ¬μ©νλ©΄ 2038λ λ¬Έμ λ μ‘°μ¬ν΄μΌ νλ€. μΌλΆ μ»΄ν¨ν° μμ€ν μμ νΉμ μκ°μ΄ μ§λλ©΄ μ€λ²νλ‘κ° λ°μνλ μ€λ₯λ₯Ό 2038λ λ¬Έμ λΌκ³ λΆλ₯Έλ€.
PostgreSQLμdate_part()ν¨μμ λμΌν λ°©μμΌλ‘datetimesλ₯Ό ꡬ문 λΆμνλ νμ€SQLextract()ν¨μλ μ§μνμ§λ§ λ κ°μ§ μ΄μ λ‘date_part()κ° κΆμ₯λλ€.
- μ΄λ¦ μ체λ§μΌλ‘ μν μ μκΈ°μν¨λ€.
extract()λ μ¬λ¬ λ°μ΄ν°λ² μ΄μ€μμ λ리 μ§μλμ§ μλλ€.
- κ·ΈλΌμλ
extract()λ₯Ό μ¬μ©ν΄μΌ νλ€λ©΄extract(text from value)νμμ μ·¨νλ€. - νμμ€ν¬νμμ μ°λλ₯Ό κ°μ Έμ€κΈ° μν΄μλ
extract('year' from '2022-12-01 18:37:12 EST'::timestamptz)μ κ°μ΄ 쿼리νλ€.
νμμ€ν¬ν κ΅¬μ± μμμμ λ μ§ μκ° κ° λ§λ€κΈ°
- μ°λ, μ, μΌμ΄ λ³λμ μ΄μ μ‘΄μ¬νλ λ°μ΄ν°μ μ λ°κ²¬νλ κ²μ λλ¬Έ μΌμ΄ μλλ€.
- μ΄λ¬ν κ΅¬μ± μμμμ
PostgreSQLν¨μλ₯Ό μ¬μ©νμ¬datetimeκ°μ μμ±ν μ μλ€.
1
2
3
4
5
6
7
8
-- λ μ§ λ§λ€κΈ°
SELECT make_date(2022, 2, 22);
-- μκ° λ§λ€κΈ°
SELECT make_time(18, 4, 30.3);
-- μκ°λκ° μ μ©λ timestamp λ§λ€κΈ°
SELECT make_timestamptz(2022, 2, 22, 18, 4, 30.3, 'Europe/Lisbon');
- μ΄ μΈ ν¨μμμλ
integerνμ μ λ³μλ₯Ό μ λ ₯μΌλ‘ μ¬μ©νμ§λ§, λ€μ λ κ°μ§ μμΈκ° μλ€.
- μ΄λ μμλ‘ λ μ΄ λ¨μλ₯Ό μ 곡ν μ μκΈ° λλ¬Έμ,
double precisionνμ μ μ«μλ‘ μ§μ ν΄μΌ νλ€. - μκ°λλ
textνμ μ λ¬Έμμ΄λ‘ μ§μ ν΄μΌ νλ€.
νμ¬ λ μ§ λ° μκ° κ²μνκΈ°
- νμ μ
λ°μ΄νΈν λ 쿼리μ μΌλΆλ‘ νμ¬ λ μ§ λλ μκ°μ κΈ°λ‘ν΄μΌ νλ κ²½μ°μ νμ€
SQLλ μ΄μ λν ν¨μλ₯Ό μ 곡νλ€.
1
2
3
4
5
6
7
SELECT
current_timestamp,
localtimestamp,
current_date,
current_time,
localtime,
now();
current_timestamp- μκ°λλ₯Ό ν¬ν¨ν νμ¬ νμμ€ν¬νλ₯Ό λ°ννλ€.
PostgreSQLμ μ© λ¨μΆ λ²μ μnow()μ΄λ€.
localtimestamp- μκ°λλ₯Ό ν¬ν¨νμ§ μμ νμ¬ νμμ€ν¬νλ₯Ό λ°ννλ€.
- μκ°λκ° μλ νμμ€ν¬νλ μλ―Έκ° μμΌλ κΆμ₯λμ§ μλλ€.
current_date: λ μ§λ₯Ό λ°ννλ€.current_time: μκ°λλ₯Ό ν¬ν¨ν νμ¬ μκ°μ λ°ννλ€.localtime: μκ°λλ₯Ό ν¬ν¨νμ§ μμ νμ¬ μκ°μ λ°ννλ€.
- μ΄λ¬ν ν¨μλ€μ μΏΌλ¦¬κ° μμν λ μκ°μ κΈ°λ‘νλ―λ‘ μΏΌλ¦¬ μ€ν μκ°κ³Όλ κ΄κ³κ° μλ€.
- λ§μ½ 쿼리 μ€ν μ€ μκ³κ° λ³κ²½λλ λ°©μμ λ μ§μ μκ°μ λ°μνκ³ μΆλ€λ©΄
clock_timestamp()ν¨μλ₯Ό μ¬μ©νμ¬ μκ° κ²½κ³Όμ λ°λΌ κΈ°λ‘ν μ μλ€. - ν΄λΉ ν¨μλ λμ©λ 쿼리λ₯Ό λλ¦¬κ² λ§λ€κ³ μμ€ν μ νμ΄ μ μ©λ μ μμΌλ―λ‘ μ£Όμν΄μΌ νλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE current_time_example (
time_id integer GENERATED ALWAYS AS IDENTITY,
current_timestamp_col timestamptz,
clock_timestamp_col timestamptz
);
INSERT INTO current_time_example
(current_timestamp_col, clock_timestamp_col)
(SELECT current_timestamp,
clock_timestamp()
FROM generate_series(1,1000));
SELECT * FROM current_time_example;
- μ
INSERTλͺ λ Ήλ¬Έμ 첫 λ²μ§Έ μ΄μ μμ μκ°μ κΈ°λ‘νλcurrent_timestampλ₯Ό μ¬μ©νλ€. - λ λ²μ§Έ μ΄μλ
clock_timestamp()μ ν΅ν΄ κ° νμ μ½μ μκ°μ κΈ°λ‘νλ€. PostgreSQLμ μ© κ΅¬λ¬ΈμΈgenerate_series()λ₯Ό ν΅ν΄ 1000κ°μ νμ μ½μ νλ€.
μκ°λ λ€λ£¨κΈ°
μκ°λ μ€μ μ°ΎκΈ°
1
2
SHOW timezone;
SELECT current_setting('timezone');
- μ λ λͺ λ Ήμ΄ μ€ νλλ₯Ό μ¬μ©νλ©΄ νμ¬ μκ°λλ₯Ό μ μ μλ€.
SHOW ALL;λͺ λ Ήμ΄λ₯Ό μ¬μ©νλ©΄PostgreSQLμλ²μ λͺ¨λ λ§€κ° λ³μ μ€μ μ μ μ μλ€.
1
SELECT make_timestamptz(2022, 2, 22, 18, 4, 30.3, current_setting('timezone'));
- λ λ¬Έμ₯ λͺ¨λ λμΌν μ 보λ₯Ό μ 곡νμ§λ§, λ€λ₯Έ ν¨μμ λν μ
λ ₯μΌλ‘λ
current_setting()μ μ¬μ©νλ κ² μ’λ€.
1
2
3
4
5
6
SELECT * FROM pg_timezone_abbrevs ORDER BY abbrev;
SELECT * FROM pg_timezone_names ORDER BY name;
SELECT * FROM pg_timezone_names
WHERE name LIKE 'Europe%'
ORDER BY name;
- μ λ λͺ λ Ήλ¬Έμ μκ°λ μ½μ΄μ μ΄λ¦μ μΆλ ₯νλ 쿼리λ€.
- λ§μ§λ§ 쿼리λ₯Ό ν΅ν΄ μ½μ΄λ₯Ό νν°λ§ ν μλ μλ€.
- μ€ν κ²°κ³Όλ λ€μκ³Ό κ°λ€.
| name | abbrev | utc_offset | is_dst |
|---|---|---|---|
| Europe/Amsterdam | CEST | 02:00:00 | true |
| Europe/Andorra | CEST | 02:00:00 | true |
| Europe/Astrakhan | +04 | 04:00:00 | false |
| Europe/Athens | EEST | 03:00:00 | true |
μκ°λ μ€μ νκΈ°
PostgreSQLμ μ€μΉν λ μλ²μ κΈ°λ³Έ μκ°λλpostgresql.confμμ λ§€κ° λ³μλ‘ μ€μ λμλ€.- ν΄λΉ νμΌμ λ³κ²½νλ©΄ λ€λ₯Έ μ¬μ©μλ μμ© νλ‘κ·Έλ¨μ μλνμ§ μμ κ²°κ³Όκ° λ°μν μ μμΌλ―λ‘ μ£Όμν΄μΌ νλ©°, μ΄λ² μ₯μμλ μΈμ λ³λ‘ μκ°λλ₯Ό μ€μ νλ λ°©λ²μ μμλ³Ό κ²μ΄λ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SET TIME ZONE 'America/Los_Angeles';
CREATE TABLE time_zone_test (
test_date timestamptz
);
INSERT INTO time_zone_test VALUES ('2023-01-01 4:00');
SELECT test_date
FROM time_zone_test;
SET TIME ZONE 'America/Indiana/Petersburg';
SELECT test_date
FROM time_zone_test;
SELECT test_date AT TIME ZONE 'Asia/Seoul'
FROM time_zone_test;
| test_date |
|---|
| 2023-01-01 21:00:00.000 +0900 |
- μ κ²°κ³Όλ
America/Los_Angeles,America/Indiana/Petersburgμ κ²°κ³Όλ€. UTCλ³΄λ€ 9μκ°μ΄ λΉ λ₯΄λ€λ μλ―Έλ€.
| timezone |
|---|
| 2023-01-01 21:00:00.000 |
- λ§μ§λ§ 쿼리μ κ²°κ³Όλ μμ κ°μΌλ©°, λ€μκ³Ό κ°μ μ¬μ€μ μ μ μλ€.
timestamptzλ μ λμ μκ°μ 보μ₯νλ€.- νμμ‘΄ λ³κ²½μ λ°μ΄ν°λ₯Ό λ³κ²½νλ κ²μ΄ μλλΌ, μΆλ ₯ λ° λ³ν μμ μμμ νν λ°©μμΌ λΏμ΄λ€.
- κ°μ νμ 보λλΌλ μΈμ νμμ‘΄μ λ°λΌ λ¬λ¦¬ λ³΄μΌ μ μλ€.
λ μ§ λ° μκ°μ νμ©νμ¬ κ³μ°νκΈ°
1
2
SELECT '1929-09-30'::date - '1929-09-27'::date;
SELECT '1929-09-30'::date + '5 years'::interval;
- μ λͺ
λ Ήλ¬Έκ³Ό κ°μ΄
datetimeλ°intervalνμ μ λν΄ κ°λ¨ν μ°μ μ μνν μ μλ€. - 첫 λ²μ§Έ 쿼리λ λ λ μ§κ° μ νν 3μΌ λ¨μ΄μ Έ μμμ μ μ μλ€.
- λ λ²μ§Έ 쿼리λ
1934-09-30μ΄λΌλ νμμ€ν¬ν κ°μ λ°ννλ€.
λ΄μμ νμ λ°μ΄ν°μμ ν¨ν΄ μ°ΎκΈ°
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
CREATE TABLE nyc_yellow_taxi_trips (
trip_id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
vendor_id text NOT NULL,
tpep_pickup_datetime timestamptz NOT NULL,
tpep_dropoff_datetime timestamptz NOT NULL,
passenger_count integer NOT NULL,
trip_distance numeric(8,2) NOT NULL,
pickup_longitude numeric(18,15) NOT NULL,
pickup_latitude numeric(18,15) NOT NULL,
rate_code_id text NOT NULL,
store_and_fwd_flag text NOT NULL,
dropoff_longitude numeric(18,15) NOT NULL,
dropoff_latitude numeric(18,15) NOT NULL,
payment_type text NOT NULL,
fare_amount numeric(9,2) NOT NULL,
extra numeric(9,2) NOT NULL,
mta_tax numeric(5,2) NOT NULL,
tip_amount numeric(9,2) NOT NULL,
tolls_amount numeric(9,2) NOT NULL,
improvement_surcharge numeric(9,2) NOT NULL,
total_amount numeric(9,2) NOT NULL
);
COPY nyc_yellow_taxi_trips (
vendor_id,
tpep_pickup_datetime,
tpep_dropoff_datetime,
passenger_count,
trip_distance,
pickup_longitude,
pickup_latitude,
rate_code_id,
store_and_fwd_flag,
dropoff_longitude,
dropoff_latitude,
payment_type,
fare_amount,
extra,
mta_tax,
tip_amount,
tolls_amount,
improvement_surcharge,
total_amount
)
FROM 'C:\YourDirectory\nyc_yellow_taxi_trips.csv'
WITH (FORMAT CSV, HEADER);
CREATE INDEX tpep_pickup_idx
ON nyc_yellow_taxi_trips (tpep_pickup_datetime);
SELECT count(*) FROM nyc_yellow_taxi_trips;
- μ λͺ λ Ήλ¬Έμ ν μ΄λΈ μμ± λ° λ΄μμμ λ Έλμ νμ λ°μ΄ν°λ₯Ό κ°μ Έμ€λ 쿼리λ€.
ν루 μ€ κ°μ₯ λ°μ μκ°λ
1
2
3
4
5
6
SELECT
date_part('hour', tpep_pickup_datetime) AS trip_hour,
count(*)
FROM nyc_yellow_taxi_trips
GROUP BY trip_hour
ORDER BY trip_hour;
- μκ° λ³ νμ μΉμ°¨ νμλ₯Ό κ³μ°νλ 쿼리λ₯Ό ν΅ν΄ ν루 μ€ κ°μ₯ λ°μ μκ°λλ₯Ό μμ보μ.
| trip_hour | count |
|---|---|
| 0 | 17,383 |
| 1 | 18,031 |
| 2 | 17,998 |
| 3 | 19,125 |
| 4 | 18,053 |
| 5 | 15,069 |
| 6 | 18,513 |
| 7 | 22,689 |
| 8 | 23,190 |
| 9 | 23,098 |
| 10 | 24,106 |
| 11 | 22,554 |
| 12 | 17,765 |
| 13 | 8,182 |
| 14 | 5,003 |
| 15 | 3,070 |
| 16 | 2,275 |
| 17 | 2,229 |
| 18 | 3,925 |
| 19 | 10,825 |
| 20 | 18,287 |
| 21 | 21,062 |
| 22 | 18,975 |
| 23 | 17,367 |
μμ
μμ μκ°ννκΈ° μν΄ CSVλ‘ λ΄λ³΄λ΄κΈ°
1
2
3
4
5
6
7
8
9
10
COPY
(SELECT
date_part('hour', tpep_pickup_datetime) AS trip_hour,
count(*)
FROM nyc_yellow_taxi_trips
GROUP BY trip_hour
ORDER BY trip_hour
)
TO 'C:\YourDirectory\hourly_taxi_pickups.csv'
WITH (FORMAT CSV, HEADER);
- λ°μ΄ν°λ₯Ό μμ λ‘ λΆλ¬μ¨ λ€ μ κ·Έλνλ₯Ό μμ±νλ©΄ ν΄λΉ λ μ§μ ν¨ν΄μ΄ λμ± λͺ ννλ€.
- λ¬Όλ‘ λ©°μΉ λλ λͺ λ¬μ κ±ΈμΉ λ°μ΄ν°λ₯Ό λ κΉμ΄ λΆμν΄μΌ ν΄λΉ λ°μ΄ν°λ₯Ό μΌλ°νν μ μλ€.
date_part()ν¨μλ‘ μμΌμ μΆμΆνμ¬ νμΌκ³Ό μ£Όλ§μ μΉμ°¨λμ λΉκ΅ν μλ μκ³ , μΌκΈ° μ보λ₯Ό νμΈνμ¬ λ μ¨μ λ°λ₯Έ μΉμ°¨λμ λΉκ΅ν μλ μλ€.
νμ μΉμ°¨ ν μ΄λ μκ°μ μΈμ κ°μ₯ κΈ΄κ°μ?
- λ΅μ μ°Ύλ ν κ°μ§ λ°©λ²μ κ° μκ°μ μ€κ° μ΄λ μκ°μ κ³μ°νλ κ²μ΄λ€.
- μ€μ κ°μ μ λ ¬λ κ° μΈνΈμ μ€κ° κ°μΌλ‘, νκ· κ³Όλ λ€λ₯΄κ² μΈνΈ μμ λ§€μ° μκ±°λ ν° κ°μ΄ κ²°κ³Όλ₯Ό μ곑νμ§ μκΈ° λλ¬Έμ λΉκ΅ν λλ μ€μ κ°μ΄ νκ· λ³΄λ€ λ μ ννλ€.
1
2
3
4
5
6
7
8
SELECT
date_part('hour', tpep_pickup_datetime) AS trip_hour,
percentile_cont(.5)
WITHIN GROUP (ORDER BY
tpep_dropoff_datetime - tpep_pickup_datetime) AS median_trip
FROM nyc_yellow_taxi_trips
GROUP BY trip_hour
ORDER BY trip_hour;
percentile_cont()λ‘ μ€μ κ°μ κ³μ°νκΈ° μν΄tpep_dropoff_datetime - tpep_pickup_datetimeλ₯Ό κ³μ°νμκ³ , κ·Έ κ°μ μ€μ κ° κ³μ°μ μ λ ¬ κΈ°μ€μΌλ‘ μΌμλ€.- κ²°κ³Όλ λ€μκ³Ό κ°λ€.
| trip_hour | median_trip |
|---|---|
| 0 | 00:14:20 |
| 1 | 00:14:49 |
| 2 | 00:15:00 |
| 3 | 00:14:35 |
| 4 | 00:14:43 |
| 5 | 00:14:42 |
| 6 | 00:14:15 |
| 7 | 00:13:19 |
| 8 | 00:12:25 |
| 9 | 00:11:46 |
| 10 | 00:11:54 |
| 11 | 00:11:37 |
| 12 | 00:11:14 |
| 13 | 00:10:04 |
| 14 | 00:09:27 |
| 15 | 00:08:59 |
| 16 | 00:09:57 |
| 17 | 00:10:06 |
| 18 | 00:07:37 |
| 19 | 00:07:54 |
| 20 | 00:10:23 |
| 21 | 00:12:28 |
| 22 | 00:13:11 |
| 23 | 00:13:46 |
Amtrak λ°μ΄ν°μμ ν¨ν΄ μ°ΎκΈ°
κΈ°μ°¨ μ΄λ μκ° κ³μ°νκΈ°
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE train_rides (
trip_id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
segment text NOT NULL,
departure timestamptz NOT NULL,
arrival timestamptz NOT NULL
);
INSERT INTO train_rides (segment, departure, arrival)
VALUES
('Chicago to New York', '2020-11-13 21:30 CST', '2020-11-14 18:23 EST'),
('New York to New Orleans', '2020-11-15 14:15 EST', '2020-11-16 19:32 CST'),
('New Orleans to Los Angeles', '2020-11-17 13:45 CST', '2020-11-18 9:00 PST'),
('Los Angeles to San Francisco', '2020-11-19 10:10 PST', '2020-11-19 21:24 PST'),
('San Francisco to Denver', '2020-11-20 9:10 PST', '2020-11-21 18:38 MST'),
('Denver to Chicago', '2020-11-22 19:10 MST', '2020-11-23 14:50 CST');
SELECT * FROM train_rides;
- κΈ°μ°¨ μ΄λ λ°μ΄ν°μ λν ν μ΄λΈκ³Ό νμ μΆκ°νμκ³ , κ²°κ³Όλ λ€μκ³Ό κ°λ€.
| trip_id | segment | departure | arrival |
|---|---|---|---|
| 1 | Chicago to New York | 2020-11-14 12:30:00.000 +0900 | 2020-11-15 08:23:00.000 +0900 |
| 2 | New York to New Orleans | 2020-11-16 04:15:00.000 +0900 | 2020-11-17 10:32:00.000 +0900 |
| 3 | New Orleans to Los Angeles | 2020-11-18 04:45:00.000 +0900 | 2020-11-19 02:00:00.000 +0900 |
| 4 | Los Angeles to San Francisco | 2020-11-20 03:10:00.000 +0900 | 2020-11-20 14:24:00.000 +0900 |
| 5 | San Francisco to Denver | 2020-11-21 02:10:00.000 +0900 | 2020-11-22 10:38:00.000 +0900 |
| 6 | Denver to Chicago | 2020-11-23 11:10:00.000 +0900 | 2020-11-24 05:50:00.000 +0900 |
1
2
3
4
SELECT segment,
to_char(departure, 'YYYY-MM-DD HH12:MI a.m. TZ') AS departure,
arrival - departure AS segment_duration
FROM train_rides;
- μ λͺ λ Ήλ¬Έμ κ° μ΄λ ꡬκ°μ κΈΈμ΄λ₯Ό κ³μ°νλ 쿼리λ€.
- μ΄ μΏΌλ¦¬λ μ¬ν ꡬκ°, μΆλ° μκ°, μ¬ν κΈ°κ°μ λμ΄νλ€.
departureμ΄μto_char()ν¨μλ νμμ€ν¬ν κ°YYYY-MM-DD HH12:MI a.m. TZνμμ λ¬Έμμ΄λ‘ λ³ννλ€.HH12λΆλΆμ 24μκ° κ΅°μ¬ μκ°μ΄ μλ 12μκ° μκ³λ₯Ό μ¬μ©νλλ‘ μ§μ νλ€.a.m.λΆλΆμ λ§μΉ¨νλ‘ κ΅¬λΆλ μλ¬Έμλ₯Ό μ΄μ©νμ¬ μ€μ λλ μ€ν μκ°μ νμνλλ‘ μ§μ νκ³ ,TZλΆλΆμ μκ°λλ₯Ό λνλΈλ€.- λ§μ§λ§μΌλ‘
arriveμμdepartureλ₯Ό λΉΌμsegment_timeꡬκ°μ νμΈνλ€. - κ²°κ³Όλ λ€μκ³Ό κ°λ€.
| segment | departure | segment_duration |
|---|---|---|
| Chicago to New York | 2020-11-14 12:30 p.m. KST | 19:53:00 |
| New York to New Orleans | 2020-11-16 04:15 a.m. KST | 1 day 06:17:00 |
| New Orleans to Los Angeles | 2020-11-18 04:45 a.m. KST | 21:15:00 |
| Los Angeles to San Francisco | 2020-11-20 03:10 a.m. KST | 11:14:00 |
| San Francisco to Denver | 2020-11-21 02:10 a.m. KST | 1 day 08:28:00 |
| Denver to Chicago | 2020-11-23 11:10 a.m. KST | 18:40:00 |
- μ κ²°κ³Όμ κ°μ΄ ν νμμ€ν¬νμμ λ€λ₯Έ νμμ€ν¬νλ₯Ό λΉΌλ©΄
intervalλ°μ΄ν° νμ μ΄ μμ±λλ€.
λμ μ΄λ μκ° κ³μ°νκΈ°
1
2
3
4
SELECT segment,
arrival - departure AS segment_duration,
sum(arrival - departure) OVER (ORDER BY trip_id) AS cume_duration
FROM train_rides;
OVER (ORDER BY ...)ꡬ문μ ν΅ν΄ λμ ν©μ 쿼리νλ€.
| segment | segment_duration | cume_duration |
|---|---|---|
| Chicago to New York | 19:53:00 | 19:53:00 |
| New York to New Orleans | 1 day 06:17:00 | 1 day 26:10:00 |
| New Orleans to Los Angeles | 21:15:00 | 1 day 47:25:00 |
| Los Angeles to San Francisco | 11:14:00 | 1 day 58:39:00 |
| San Francisco to Denver | 1 day 08:28:00 | 2 days 67:07:00 |
| Denver to Chicago | 18:40:00 | 2 days 85:47:00 |
- μ 체 μ΄λ μκ°μ κ³μ°νμλλ°, κ²°κ³Ό λκ³λ μ ννμ§λ§ μ μ©νμ§ μμ νμμΌλ‘ μΆλ ₯λμμμ μ μ μλ€.
- μ΄λ
PostgreSQLμ΄ μΌ λΆλΆμ λν ν©κ³μ μκ° λΆλΆμ λν ν©κ³λ₯Ό λ°λ‘ μμ±ν¨μ μ μ μλ€. - μ΄λ¬ν μ νμ μ°ννκΈ° μν΄ λ€μκ³Ό κ°μ΄ 쿼리ν μ μλ€.
1
2
3
4
5
SELECT segment,
arrival - departure AS segment_duration,
justify_interval(sum(arrival - departure)
OVER (ORDER BY trip_id)) AS cume_duration
FROM train_rides;
| segment | segment_duration | cume_duration |
|---|---|---|
| Chicago to New York | 19:53:00 | 19:53:00 |
| New York to New Orleans | 1 day 06:17:00 | 2 days 02:10:00 |
| New Orleans to Los Angeles | 21:15:00 | 2 days 23:25:00 |
| Los Angeles to San Francisco | 11:14:00 | 3 days 10:39:00 |
| San Francisco to Denver | 1 day 08:28:00 | 4 days 19:07:00 |
| Denver to Chicago | 18:40:00 | 5 days 13:47:00 |
justify_interval()ν¨μλ 24μκ°μ μΌλ‘, 30μΌμ μλ‘ λ³ννλλ‘ κ°κ²© κ³μ°μ μΆλ ₯μ νμ€ννλ€.- μ΄λ₯Ό ν΅ν΄ μΆλ ₯μ΄ λμ± μ΄ν΄νκΈ° μ¬μμ‘λ€.

