0

タイムスパン チャンクを含むテーブルがあります。
期間には開始日と日数があります

  1. 表には重複しない期間があります。例:
    2012-01-01 + 5 日および 2012-05-01 + 3 日


  2. また、2012 年 1 月 1 日 + 5 日と 2012 年 1 月 3 日 + 3 日など、重複する期間もあります。

  3. ただし、連続して発生するものに主に関心があります。たとえば、
    2012-01-01 + 5 日および 2012-01-06 + 3 日および 2012-01-09 + 13 日です。

1. と 2. を通常 (各エントリを 1 行として) 選択するクエリが必要です。
ケース 3. 1 つの行として組み合わせて選択する必要があります。たとえば、
2012-01-01 + 5日と 2012-01-06 + 3日 = 2012-01-01 + 8
2012-01-01 + 5 日 と 2012- 01-06 + 3日および 2012-01-09 + 13日 = 2012-01-01 + 21 日

DB の例を次に示します。

CREATE TABLE IF NOT EXISTS `chunks` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`start` date NOT NULL,
`length` smallint(4) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM ;


INSERT INTO `chunks` (`id`, `start`, `length`) VALUES
(1, '2012-01-01', 5),
(2, '2012-05-01', 3),
(3, '2012-01-03', 3),
(4, '2012-01-06', 3),
(5, '2012-01-09', 13);

これは MySQL で可能ですか? それとも、後で Java を使用したほうがよいのでしょうか。

4

1 に答える 1

0

2 つの間隔が同じ日に到達する可能性があるため、問題は十分に制約されていません。その場合、それらはどのようにマージされますか?

2012-01-01 5
2012-01-02 4
2012-01-06 3

つまり、この問題は、最初に葉から木をトラバースすることと同じです。一般に、この問題を解決するには、ループなどの SQL のみのソリューションから抜け出す必要があります。

シーケンス間にギャップがある場合 (つまり、重複がない場合)、問題は SQL で解決できます。1 つの方法は、カレンダー テーブルを使用することです。2 つ目は、複雑な SQL を使用して期間を次の期間とマージする必要があるかどうかを判断し、最初のマージされていない期間を見つけて、結果をグループ化して期間を結合することです。

于 2012-09-28T13:45:20.677 に答える