0

ID、ParentID、Timestamp、Valueの4つの列を持つテーブルがあるとします。ParentIDは、値の意味を変更します。ParentID = 1であり、タイムスタンプがParentID = 2であり、ParentID.Value>10であるテーブル内のアイテムのタイムスタンプ内にあるこのテーブルからすべてのエントリを返す必要があります。

たとえば、次のデータがあります。

ID    ParentID    TimeStamp    Value
1     1           51           1
2     2           52           11
3     1           53           2
4     1           54           3
5     2           55           9
6     1           56           4
7     2           57           12
8     1           58           5
9     1           53.5         1

ID 3、4、8、および9の行を返すクエリが必要です。このクエリはSQLまたはLINQでどのように表示されますか?自分で参加することは許可されていますか?ここでそのアプローチを使用しますか?タイムスタンプの範囲を決定する方法に固執しています。私はSqliteを使用しています。ありがとう。

明確化:ParentID = 2の最新の(タイムスタンプで判断された)行でフィルタリングしたいと思います。

4

3 に答える 3

3

この醜くて遅いクエリは、ParentID=1行ごとに適切なParentID=2行を見つけ、Valueが10より大きいかどうかをチェックします。その場合、行を出力します。

select * 
  from table1
 where table1.parentid = 1
   and exists
       (
         select null
         -- Isolate previous ParentID = 2 row
         from
         (
           select p2.value
             from table1 p2
            where p2.timestamp < table1.timestamp
              and p2.parentid = 2
              -- Only one needed
            order by p2.timestamp desc
            limit 1
         ) p2_1
         -- Make sure it has appropriate value
         where p2_1.value > 10
       )

これは、スキーマの変更後にテーブルを更新するコンテキストで1回だけ実行する価値があります。ParentIDを実際にParentIDに変更できる(つまり、レコードを階層的に接続する)ことができれば、クエリは簡単になります。

select Child.*
  from table1 Child
 inner join table1 Parent
    on child.ParentID = Parent.ID
 where Parent.Value > 10

もちろん、ParentIDは挿入前に検出する必要があり、ビジネスモデルで異常な挿入が許可されている場合は、いくつかの数学が関係します。タイムスタンプの単純な追加だけが期待される場合、これが最も簡単な解決策になります。

このクエリのSQLフィドルライブテストがあります。

于 2012-05-07T23:51:04.480 に答える
0

LINQを使用すると、1つのクエリである必要がない場合、これは機能するはずです。

var values = table.Where(a => a.parentid == 2 
                           && a.value > 10)
                  .Select(a.timestamp);

var min = values.Min();
var max = values.Max(); 

var result = table.Where(a => a.parentid == 1
                            && timestamp >= min 
                            && timestamp <= max)
                  .Select(a => a.value);
于 2012-05-07T20:55:52.727 に答える
0

これは異常な問題です。これが宿題の場合は、そのようにタグ付けする必要があります。

次のクエリは、あなたが説明したことを実行しているようです。

select p1.*
from (select *
      from table t
      where ParentId = 1
     ) p1 cross join
     (select min(TimeStamp) as minTS, max(TimeStamp) as maxTS
      from table t
      where ParentId = 2 and value > 10
     ) p2
where t.TimeStamp between minTS and maxTS   

そして、あなたの質問に対する答えは「はい」です。すべてのSQLデータベースは自己結合をサポートしています。

于 2012-05-07T20:21:38.787 に答える