This repository has been archived on 2025-12-15. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
2024-09-20 14:17:13 +03:00

62 lines
2.9 KiB
SQL

-- a) For each customer: articles that the customer bought at the same day of month for two consecutive months, e.g. 16.7.2019 and 16.6.2019.
SELECT DISTINCT t1.n as Customer,t1.d||' and '||t2.d as Time,t1.i||', '||t2.i as Items FROM purchases t1, purchases t2
WHERE (DATE_PART('day', AGE(t1.d, t2.d)))=0 AND (DATE_PART('month', AGE(t1.d, t2.d)))=1 AND t1.n = t2.n
-- b) For each customer: timeslot in which the customer has been active,i.e. number of days between the first and the last purchases
SELECT DISTINCT t1.n as Customer, abs(t1.d-t2.d) as Interval FROM purchases t1, purchases t2
WHERE t1.n = t2.n AND abs(t1.d-t2.d) > 0
-- c) All purchases of customers in February and March of leap years
SELECT * FROM purchases
WHERE (EXTRACT(MONTH from d)=2 OR EXTRACT(MONTH from d)=3) AND EXTRACT(YEAR from d)::integer % 4 =0
-- d) Get pairs of customers - each with more than a singleton purchase - that have overlapping active purchase periods.
SELECT DISTINCT t1.n as Customer1,t1.d||' and '||t2.d as Time, t3.n as Customer2,t3.d||' and '||t4.d as Time FROM purchases t1
JOIN purchases t2 on t1.n = t2.n AND t1.d <>t2.d AND t1.d<t2.d
JOIN purchases t3 on t1.n <> t3.n
JOIN purchases t4 on t3.n=t4.n AND t3.d<>t4.d AND t3.d < t4.d
WHERE (t1.d,t2.d) OVERLAPS (t3.d,t4.d) AND t1.n<t3.n
-- e) All purchases of the last Fridays of a month.
select * FROM
(SELECT n as Customer,
CASE
WHEN extract(isodow from (date_trunc('month', d::date) + interval '1 month' - interval '1 day'))=7 THEN
CASE
WHEN (date_trunc('month', d::date) + interval '1 month' - interval '3 day')=d IS TRUE THEN d
END
WHEN extract(isodow from (date_trunc('month', d::date) + interval '1 month' - interval '1 day'))=6 THEN
CASE
WHEN (date_trunc('month', d::date) + interval '1 month' - interval '2 day')=d IS TRUE THEN d
END
WHEN extract(isodow from (date_trunc('month', d::date) + interval '1 month' - interval '1 day'))=5 THEN
CASE
WHEN (date_trunc('month', d::date) + interval '1 month' - interval '1 day')=d IS TRUE THEN d
END
WHEN extract(isodow from (date_trunc('month', d::date) + interval '1 month' - interval '1 day'))=4 THEN
CASE
WHEN (date_trunc('month', d::date) + interval '1 month' - interval '7 day')=d IS TRUE THEN d
END
WHEN extract(isodow from (date_trunc('month', d::date) + interval '1 month' - interval '1 day'))=3 THEN
CASE
WHEN (date_trunc('month', d::date) + interval '1 month' - interval '6 day')=d IS TRUE THEN d
END
WHEN extract(isodow from (date_trunc('month', d::date) + interval '1 month' - interval '1 day'))=2 THEN
CASE
WHEN (date_trunc('month', d::date) + interval '1 month' - interval '5 day')=d IS TRUE THEN d
END
WHEN extract(isodow from (date_trunc('month', d::date) + interval '1 month' - interval '1 day'))=1 THEN
CASE
WHEN (date_trunc('month', d::date) + interval '1 month' - interval '4 day')=d IS TRUE THEN d
END
END as Date, i as Items FROM Purchases) AS x
WHERE x.Date is not null