1

次のようなデータベースがあるとします。

books
-----
id
name

そして、データベース内の本の総数、可能な限り最も簡単なSQLを取得したいとしました。

"select count(id) from books"

しかし今、あなたは先月の本の総数を取得したいと思っています...

編集:しかし、一部の本は先月からテーブルから削除されています

明らかに、すでに過ぎた1か月の合計はできません。「本」テーブルは常に最新であり、一部のレコードはすでに削除されています。

私のアプローチは、月末にcronジョブ(またはスケジュールされたタスク)を実行し、合計をreport_dataという別のテーブルに格納することでしたが、これは不格好なようです。より良いアイデアはありますか?

4

8 に答える 8

3

値がGETDATE()のデフォルトの列を追加し、「DateAdded」と呼びます。次に、任意の2つの日付の間でクエリを実行して、その日付期間中に何冊の本があったかを調べるか、1つの日付を指定して、特定の日付の前に(履歴に至るまで)何冊の本があったかを調べることができます。

コメントごと:削除しないでください。ソフト削除する必要があります。

于 2009-07-16T01:40:40.507 に答える
1

JPに同意し、ソフト削除/論理削除を行います。クエリごとに1つの追加のANDステートメントを使用すると、すべてがはるかに簡単になります。さらに、データが失われることはありません。

確かに、極端なサイズが問題になる場合は、そうです、行を物理的に移動/削除し始める必要がある可能性があります。

于 2009-07-16T01:55:38.787 に答える
1

私のアプローチは、月末にcronジョブ(またはスケジュールされたタスク)を実行し、合計をreport_dataという別のテーブルに格納することでしたが、これは不格好なようです。

私はこの方法を使用して、履歴データを収集および保存しました。これは、ソフト削除ソリューションよりも単純でした。理由は次のとおりです。

  • 「report_data」テーブルは、からレポート/グラフを生成するのが非常に簡単です
  • 書籍を削除する必要がある場合は、特別なソフト削除コードを実装する必要はありません。
  • 書籍テーブルから選択するすべてのクエリの最後に「andactive=1」を追加する必要はありません。

履歴レポートを実行するコードは、本を使用する他のすべてのものから分離されているため、これは実際にはそれほど扱いにくいソリューションではありませんでした。

于 2009-07-16T02:02:18.000 に答える
1

前月のデータが必要な場合は、古いデータを削除してはいけません。代わりに、「論理的な削除」を行うことができます。

ステータスフィールドといくつかの日付をテーブルに追加します。

books
_____
id
bookname
date_added
date_deleted
status (active/deleted)

そこから、次のクエリを実行できます。

SELECT count(id) FROM books WHERE date_added <= '06/30/2009' AND status = 'active'

注:これは最良のスキーマではありませんが、アイデアは得られます...;)

于 2009-07-16T04:03:17.287 に答える
1

テーブルのスキーマを変更するのが面倒な場合は、変更を追跡するトリガーを追加します。このアプローチを使用すると、追加された日付、削除された日付など、あらゆる種類のものを追跡できます。

于 2009-07-16T04:04:18.907 に答える
1

あなたの問題とスキーマとコードの変更に消極的であることを見て、月末に本を数え、その月の数を別のテーブルに保存するという考えを持って行くことをお勧めします。これを行うには、データベーススケジューラを使用してSPを呼び出すことができます。

于 2009-07-16T04:13:35.253 に答える
1

あなたは、歴史データベースやデータウェアハウジングの道を歩み始めたところです。

データウェアハウスは通常、現在のデータに取って代わるのではなく、後のデータが現在のデータに追加されるような形式で、物事の状態に関するデータを格納します。データウェアハウジングについて学ぶことはたくさんあります。もしあなたが真剣にその道を進んでいるのなら、ラルフ・キンボールかビル・インモンの本を提案します。私はキンボールが好きです。

これがウェブサイトです:http ://www.ralphkimball.com/

http://www.inmoncif.com/home/

一方、この領域への最初のステップが実行する予定の唯一のステップである場合は、提案されたソリューションで十分です。

于 2009-07-16T12:43:35.030 に答える
0

必要なことを行う唯一の方法は、booksテーブル「date_added」に列を追加することです。次に、次のようなクエリを実行できます

select count(id) from books where date_added <= '06/30/2009'; 
于 2009-07-16T01:31:26.867 に答える