1

次のようなデータのテーブル 1 があります。

Record# Date        Person
1       12/12/2012  Tom
2       01/02/2013  Tom
3       10/02/2013  Tom
4       02/01/2013  John
5       04/01/2014  John
6       30/06/2010  Mary
7       30/06/2011  Mary
8       30/06/2012  Mary
9       30/07/2012  Mary

そして、各人の登録日がある別の表2

Person  RegisterDate   MaxRecord
Tom     15/12/2011     100
John    01/01/2013     10
Mary    16/06/2010     50

table1 にレコードを追加する前に、Person ごとのレコード (table1) の年間カウントがその Person の MaxRecord 数 (table2) よりも小さいかどうかを確認する必要があります。年次とは、startDate = 登録日、endDate = 登録日 + 1 年を意味し、1 月 1 日から 12 月 31 日までではありません。

Mary のレコードを追加する場合は、次の出力が得られる SQL を記述します。

StartDate   EndDate     CountRecord
16/06/2010  15/06/2011    1
16/06/2011  15/06/2012    1
16/06/2012  15/06/2013    2

この出力が作成されたら、(Person の) 新しいレコードの日付が許可されているかどうかをテストできます。

誰かが私に手がかり、チュートリアルへのリンク、または助けをくれませんか?

4

1 に答える 1

0

以下では、すでに数値表があると仮定しています。数値表がない場合は、作成することをお勧めしますが、したくない場合は、数値表で数値リストを作成できます。飛ぶ

登録日 (RegDate) のテーブルと数値テーブルをクロス結合することで、すべての境界のリストを取得できます。

SELECT  r.Person, 
        DATE_ADD(r.RegisterDate, INTERVAL n.Number YEAR) PeriodStart,
        DATE_ADD(r.RegisterDate, INTERVAL n.Number + 1 YEAR) PeriodEnd,
        n.Number
FROM    RegDate r
        CROSS JOIN Numbers n;

これにより、次のようなテーブルが得られます(TomWHERE n.Number <= 3;の例として追加するだけです)。

Person  PERIODSTART   PERIODEND   NUMBER
Tom     15/12/2011    15/12/2012    0
Tom     15/12/2012    15/12/2013    1
Tom     15/12/2013    15/12/2014    2
Tom     15/12/2014    15/12/2015    3

SQL Fiddle の例

次に、これを他の日付 (T) のテーブルに結合して、カウントを行う必要があります。

SELECT  r.Person,
        DATE_ADD(r.RegisterDate, INTERVAL n.Number YEAR) StartDate,
        DATE_ADD(DATE_ADD(r.RegisterDate, INTERVAL n.Number + 1 YEAR), INTERVAL -1 DAY) EndDate,
        COUNT(T.Record) AS `CountRecord`
FROM    RegDate r
        CROSS JOIN Numbers n
        LEFT JOIN T
            ON T.Person = r.Person
            AND T.Date >= DATE_ADD(r.RegisterDate, INTERVAL n.Number YEAR)
            AND T.Date < DATE_ADD(r.RegisterDate, INTERVAL n.Number + 1 YEAR)
WHERE   DATE_ADD(r.RegisterDate, INTERVAL n.Number YEAR) <= CURRENT_TIMESTAMP
AND     r.Person = 'Mary'
GROUP BY r.Person, R.RegisterDate, n.Number;

次の最終結果が得られます。

PERSON  STARTDATE   ENDDATE     COUNTRECORD
Mary    2010-06-16  2011-06-15      1
Mary    2011-06-16  2012-06-15      2
Mary    2012-06-16  2013-06-15      1
Mary    2013-06-16  2014-06-15      0

SQL-Fiddle の完全な例

この行を使用して、結果を StartDate が今日よりも小さい場所に限定しました

WHERE   DATE_ADD(r.RegisterDate, INTERVAL n.Number YEAR) <= CURRENT_TIMESTAMP

必要に応じて明らかにこれを変更できます

于 2013-10-02T08:39:58.147 に答える