2

システム内のアクティブなクライアントの平均数を決定するアルゴリズムを構築する方法に頭を悩ませています。ID、連絡先の開始日、連絡先の終了日、アカウントの開始日と終了日、取引日など、さまざまな情報が保存されています。特定の日にアクティブなクライアントの数を特定する方法がわかりません。

データベースの構造を変更したり、テーブルを大幅に変更したりすることはできないため、自分が持っているもので作業する必要があります。私がこれを行うと思う1つのアイデアは、連絡先の終了日が日付Xよりも後かどうか、またはnullであるかどうかを確認することです-連絡先の開始日が日付Xよりも前であるかどうかを確認します。私が入れたどの日も同じ数です。これを試す別の方法はありますか? 仕事に着いたらそのコードを追加できますが、今のところ検討のために提出します...

**申し訳ありません..私は重要な部分を残しました. 過去の特定の日の合計アクティブ数を特定し、1 年間の毎日の平均合計を取得できるようにする必要があります。以下の投稿の助けを借りて、この最初の部分を解決した可能性があります。最初に、検索する必要がある日付を保持する変数をクエリに作成しました... @report_dt

and contact_end_dt >= @report_dt
and contact_start_dt <= @report_dt

その作品は私のためにそれをしました。ここで、これを何年にもわたってループし、@report_dt 変数を 1 日ずつインクリメントする方法を理解する必要があります。

すべての助けをありがとう...あなたは素晴らしいです! ダグ

4

4 に答える 4

1

以下を含めて少し拡張できる場合:
- 試したが機能しなかったコード
- テーブルの実際のスキーマ (データ型、制約などを含む)
- 入力データと出力データの例

それにもかかわらず、あなたが望むように見える簡単なクエリは...

SELECT
  *
FROM
  yourTable
WHERE
      (contact_start_date >= CAST('20120510' AS DATETIME) OR contact_start_date IS NULL)
  AND (contact_end_date   <= CAST('20120510' AS DATETIME) OR contact_end_date   IS NULL)

(ただし、データの制約によっては、NULL の開始日を確認する必要がない場合があります。)

それがあなたがすでに試したことと重複する場合は、あなたの質問への更新を待ちます:)

于 2012-05-10T14:31:47.363 に答える
1

ダグ、

クライアントが「アクティブ」であることが何を意味するのかについて、あなたは微かな考えも示していません。それが分かれば、この問題は解決できます。

たとえば、2012 年 5 月 10 日の日付について、アクティブな顧客を 1 つずつリストするクエリを作成できますか? もしそうなら、

  1. 各日 (または営業日) に 1 つの行を含む、日付の個別のテーブルを作成します。
  2. 2012 年 5 月 10 日に作成したクエリを使用しますが、日付テーブルからの左外部結合を使用します。dateTable.theDate、count(*) のみを選択し、theDate でグループ化します。

より具体的な内容が必要な場合は、質問に具体的な内容を記載してください。列やテーブルの名前が 1 つもない、とりとめのない質問では、あまり役に立ちません。ここで賛成票を獲得する質問を見てください。

于 2012-05-10T16:39:00.610 に答える
1

sysdate がコンタクト開始日とコンタクト終了日の間にあるクエリを実行できますか?

連絡の開始日と連絡の終了日、アカウントの開始日と終了日があります。アカウントの開始日と終了日のデータを信頼できますか? アカウントが非アクティブとみなされるまで、どのくらいの期間アクティビティがないと見なされますか? その質問に答えることができれば、答えにたどり着けるはずです。

ありがとう、スーザン

于 2012-05-10T14:22:08.647 に答える
0

これは興味深い問題です。次のクエリは、SQL Server と、row_nubmer() をサポートする任意のデータベースを使用して問題を解決します。ただし、すべての日付に開始と終了があると仮定します。

with starts as 
(
   select start_date as thedate,
       row_number() over (partition by null order by start_date) as cumstarts
   from customers
),
ends as 
(
   select end_date as thedate,
       row_number() over (partition by null order by end_date) as cumends
   from customers
)
select thedate, cumstarts - cumends
from 
(
  (select * from starts) 
  union all 
  (select * from ends)
) t
group by thedate

一部のデータベースは累積合計を直接提供するため、簡単になります。

開始日と終了日が異なる場合、問題は SQL Server では少しトリッキーです。

于 2012-05-10T15:51:53.643 に答える