2017-06-19 5 views
0

私は以下のようなデータ構造を持っていると仮定し(時系列DBのように、...特定の時点のデータを取得することができます)
UPDATED_DATEはステータス最終更新日このタイプのデータベースは存在しますか? 0がオフラインで、1はオンラインで、</p> <p>USER_KEYは、ユーザーの一意のキー<BR/> STATUSです...

USER_KEY | STATUS |  UPDATED_DATE 
---------------------------------------- 
    1 | 1 | 2017-06-19 00:01:00 
    2 | 1 | 2017-06-19 00:01:01 
    3 | 1 | 2017-06-19 00:01:02 
    4 | 1 | 2017-06-19 00:01:02 
    1 | 0 | 2017-06-19 05:42:06 

であり、私は特定の時点のデータを取得したいです。

私は '2017-06-19 04:00:00'
ライブユーザ数が4
とライブユーザー{1,2,3,4}

であると私は'2017-06-19 11:00:00'を選択すると、
ライブユーザ数が3
で、ライブユーザーが{2,3,4}
である選択ユーザー1は5:42 AMにオフラインになったためです。

と私は特定の時点データを取得したいと思います。
今まで1時間ごとにユーザーステータスデータを保存しています。
このデータは大きすぎて非効率的です。
データベースはこのタイプのデータを効率的に保存できますか?

確かに、毎回カウント数を保存することはできますが、カウントするだけでなく、すべてのユーザーのキーを必要とします。

+0

質問を編集し、使用しているデータベースで質問にタグを付けてください。 –

+0

@GordonLinoff私はSQL Serverを使用していますが、これはSQL Serverに関するものではありません。 –

+1

この質問はどのようにSQL Serverについてですか? SQLの構文は各データベースで異なります – GuidoG

答えて

0

特定の時点より前の各ユーザーの最終ステータスを探しています。 SQL Serverでは、ウィンドウ関数を使用することができます。

select count(*) 
from (select t.*, 
      row_number() over (partition by user_key order by updated_date desc) as seqnum 
     from t 
     where updated_date < @datetime 
    ) t 
where seqnum = 1 and status = 1; 

あなたがユーザーのリストが必要な場合はselect *を言うことができます。

「データベースの種類」の意味を理解できません。標準SQLでこれを簡単に行うことができます。

+0

お返事ありがとうございます。 'データベースの種類'とは、influxdb、postgresqlなどのような別のデータベースを意味します。あいまいな言葉を選んだのは残念です。 –

関連する問題