-2

[新聞、雑誌] の各地域で発行頻度を指定できる [新聞、雑誌] のコンセプトがあります。毎月発行する地域もあれば、年に 1 回だけ発行する地域もあります。

select id, frequency from regions;
 id | frequency
----+-----------
  1 | 1 year
  2 | 6 mons
  3 | 4 mons
  4 | 1 mon

版の名前は、翻訳しやすいように日付になっています。これは、常に月の名前 (それが書かれた言語で) と発行された年であるためです。開始日と終了日は、記事が版に含まれると見なされる基準点です (すべての記事が公開されるわけではないため、記事と版の間のリンクを含む別の表があります)。

select region_id, name, date_start, date_end from editions;
 region_id |    name    |       date_start       |        date_end
-----------+------------+------------------------+------------------------
         1 | 2013-01-01 | 2012-03-24 00:00:00-04 | 2012-12-23 23:59:59-05
         2 | 2013-01-01 | 2012-09-24 00:00:00-04 | 2012-12-23 23:59:59-05
         3 | 2013-01-01 | 2012-11-24 00:00:00-05 | 2012-12-23 23:59:59-05
         4 | 2013-01-01 | 2013-02-24 00:00:00-05 | 2012-12-23 23:59:59-05
         2 | 2013-07-01 | 2012-12-24 00:00:00-05 | 2013-12-23 23:59:59-05
         1 | 2014-01-01 | 2012-12-24 00:00:00-05 | 2014-12-23 23:59:59-05
         4 | 2013-02-01 | 2012-12-24 00:00:00-05 | 2013-02-23 23:59:59-05
         3 | 2013-05-01 | 2012-12-24 00:00:00-05 | 2013-08-23 23:59:59-04

各地域の次のエディションを生成するための次のクエリがあります。

INSERT INTO editions
    (region_id, name, date_start, date_end)
SELECT 
    regions.id,
    (last_edition.name + regions.frequency) :: date AS name,
    last_edition.date_end + interval '1 second' AS date_start,
    last_edition.name + regions.frequency + regions.frequency - interval '1 month' + interval '22 23:59:59' AS date_end
FROM
    (SELECT region_id, max(name) :: timestamp AS name, max(date_end) AS date_end FROM editions GROUP BY region_id, date_end) AS last_edition JOIN
    regions ON regions.id = last_edition.region_id

問題は、クエリを実行するたびに、リージョンごとに同じ数のエディションが作成されることです。私が探しているのは、日付を指定すると、その日付までのすべての単一地域の最新版から始まるすべての版を生成するクエリです。たとえば、日付が今から 1 年後の場合、次の数のエディションが生成されます。

  • 地域ごとに 1 エディション、頻度は1 year
  • 地域ごとに 2 つのエディション、頻度は6 months
  • 地域ごとに 4 つのエディション、頻度は3 months
  • 地域ごとに 12 エディション、頻度は1 month

この種のクエリは、通常、すべてのリージョンに対して cron ジョブを介して一度に実行されますが、頻度が変更されたためにエディションを再生成する必要がある場合は、特定のリージョンに対して実行できます。

4

1 に答える 1

2

次のようなものを試してください:

SELECT 
    regions.id,
    name as last_name, 
    generate_series(name + frequency,'2015-01-01',frequency) as name,

    generate_series(name + frequency,'2015-01-01',frequency) 
    + frequency 
    - interval '1 month' 
    + interval '23 days' AS date_start,

    generate_series(name + frequency,'2015-01-01',frequency) 
    + 2 * frequency 
    - interval '1 month' 
    + interval '22 23:59:59' AS date_end

FROM (SELECT region_id, max(name) AS name
      FROM editions 
      GROUP BY region_id) AS last_edition 
JOIN regions ON regions.id = last_edition.region_id

ORDER BY 1, 2

最新のエディションから指定された日付までのすべてのエディションを生成します ('2015-01-01'例)。

于 2013-01-15T21:06:32.277 に答える