24 Temmuz 2019 Çarşamba

GENERATE_SERIES - Belirtilen iki aralık arasında değer dizisi üretir

Giriş
Belirtilen iki aralık arasında değer dizisi üretir. Tabloyu doldurmak/populate için kullanılabilir
Örnek
Tabloyu doldurmak için şöyle yaparız.
-- Sample table with 1 million rows
CREATE TABLE large_table (
  id INT,
  name VARCHAR(50), 
  address VARCHAR(100)
);

-- Insert 1 million rows 
INSERT INTO large_table 
SELECT id, 
       concat('Name ', id),
       concat('Address ', id)
FROM generate_series(1, 1000000) AS id;

Örnek - interval
Elimizde şöyle iki tablo olsun
create table employee (
    id int,
    name char(20),
    division_id int
);

create table attendance (
    id int,
    employee_id int,
    activity_type int,
    created_at timestamp
);
attendance değerlerini günlük olarak görmek istersek şöyle yaparız. FROM içindeki SELECT cümlesinde attendance tablosundaki en küçük ve en büyük created_at değerleri alınıyor. Bu değerler generate_series()'e veriliyor. Bu çağrı sonucunda g g(days) ile days isimli bir tablo oluşturuluyor. Bu tablonun date isimli bir sütunu var. Dışarıdaki SELECT içinde bu sütuna erişiliyor.
SELECT
days::date AS created_date, e.* FROM (SELECT MIN(created_at), MAX(created_at) FROM attendance) AS r(startdate,enddate),
generate_series(startdate::timestamp,enddate::timestamp,interval '1 day') g(days) CROSS JOIN employee e
Çıktı olarak şunu alırız
created_date id name division_id
2020-11-18 1 John    1
2020-11-18 2 Amber   2
2020-11-18 3 Mike    1
2020-11-18 4 Jimmy   1
2020-11-18 5 Kathy   2
2020-11-19 1 John    1
2020-11-19 2 Amber   2
2020-11-19 3 Mike    1
2020-11-19 4 Jimmy   1
2020-11-19 5 Kathy   2
Örnek
Şöyle yaparız. Bu sefer belirtilen iki tarih arasında 1 günlük aralıklar oluşturuluyor
SELECT 
     d::date AS created_date,  
     e.id,  
     e.company_id,
     e.division_id
     
FROM(SELECT MIN(date '2020-11-23'), MAX(date '2020-11-24') FROM employee_table)
AS r(startdate,enddate), 
  generate_series(startdate::timestamp,enddate::timestamp,interval '1 day') g(d)
CROSS JOIN  employee_table e

Hiç yorum yok:

Yorum Gönder