-1

ログからグラフを作成する必要があります。ログエントリは定期的ではありません。

開始日の直前(つまり、直前のログが入力されたときから)の値とともに、日付間の行を選択したいと思います。

だから、言いましょう:

テーブルFooには列がidあり、value

テーブルBarにはid、、、foo_idおよびvalue列があり、

テーブルにBarLogid、、、、およびがあります。foo_idbar_idbar_valuetimestamp

したがって、1つのFooに多くのバーが存在する可能性があります。

たとえば、とfoo_idの間に あるすべてのバーのBarLogからのすべての行と、各バーの値(行)が必要です。07/01/201207/31/201207/01/2012

それが理にかなっていることを願っていますが、そうでない場合は、明確にしようと思います。


編集(コンテキストのために左上):

これをもう1つのステップで単純化してみましょう。2つの外部キー、、、および、を含むテーブルがある場合fk_afk_b指定されたdisticttimestampを含む最新の行を取得するにはどうすればよいですか。fk_afk_b

提案されているように、ここに例があります。

+----+------+------+-------------+
| id | fk_a | fk_b |  timestamp  |
+----+------+------+-------------+
| 1  | 1    | 1    | 01-JUL-2012 |
| 2  | 2    | 2    | 02-JUL-2012 |
| 3  | 1    | 1    | 04-JUL-2012 |
| 4  | 2    | 2    | 05-JUL-2012 |
| 5  | 1    | 3    | 07-JUL-2012 |
+----+------+------+-------------+

afk_aが1の場合、行3と5が必要になります。したがって、行1、3、および5(1の行)のみを見てfk_a、それぞれの最新のものを取得しますfk_b(行3は行1よりも新しいfk_b=1)。

再度、感謝します。

4

3 に答える 3

0

このようなものをお探しですか?

        SELECT bl.bar_value, timestamp
  FROM foo f, bar b, barlog bl
 WHERE     f.id = b.id
       AND b.foo_id = bl.foo_id
       AND timestamp BETWEEN '01-JUL-2012' AND '31-JUL-2012'
       AND b.foo_id = :enter_value_here
ORDER BY timestamp DESC

:enter_value_hereを使用して、データが必要なfoo_idを追加します...

どのプロットツールを使用していますか?データセットを取得して、プロット用にExcelにプッシュすることができます。いずれの場合でも、上記のクエリによって、実行しようとしていることに近づくことができます。

于 2012-08-20T21:46:56.727 に答える
0

密集合の場合は、日付テーブルを作成し、次のクエリを実行します。

DECLARE @StartDate datetime

SET @StartDate = '2012-01-01'

SELECT f.ID as foo_id, b.bar_id, f.Value, GetDate() as DateStamp
FROM Foo f
inner join Bar b on f.id = b.foo_id
WHERE /*enter criteria for bar selection*/
UNION ALL
SELECT f.ID as foo_id, b.bar_id, f.Value, GetDate() as DateStamp
FROM (
    SELECT MAX(bl.timestamp) as bl_timestamp, bl.bar_id as bar_id
    FROM Dates d 
    INNER JOIN BarLog bl on bl.timestamp < d.Date
    WHERE /*enter criteria for bar selection*/
    GROUP BY bl.bar_id
) as pi
INNER JOIN BarLog bl on pi.bar_id = bl.bar_id and bl.timestamp = pi.bl_timestamp
WHERE d.Day_Of_Month = 1 and d.Date between @StartDate and getDate()
  AND /*enter criteria for bar selection*/

日付テーブルは、 http://it.toolbox.com/wiki/index.php/Create_a_Time_Dimension_/_Date_Tableのようなものにすることも、クエリごとに一時的に作成することもできます。

CREATE TABLE #Dates ([Date] datetime, Day_Of_Month int)

DECLARE @cDate datetime
SET @cDate = @StartDate

WHILE @cDate < getdate()
BEGIN
    INSERT INTO #Dates (Date, Day_Of_Month)
    SELECT @cDate, Datepart(d, @cdate)

    SET @cDate = DATEADD(m, 1 + DATEDIFF(m, 0, @cdate), 0)
END

選択の後にDROP TABLE #Dates座って。

このクエリは次を返します。

Foo_ID、Bar_ID、datestampでの値、Datestamp

日付スタンプは一度に1か月ずつ増加します。

于 2012-08-20T22:31:43.287 に答える
0

ついに私が探していたものを持っているこの質問を見つけました。基本的には、グループ化された選択に参加するだけです。だから私の編集の答えは次のようになります

SELECT * FROM SomeTable a
JOIN (
    SELECT fk_b, MAX(timestamp) as latest
    FROM SomeTable
    GROUP BY fk_b
) b
ON a.id = b.id
WHERE a.fk_a = @someIdA

fk_bこれは、指定された各個別の最新のものを返しますfk_a

元の質問は、日付間の単純な取得を使用したこれの結合です。

于 2012-08-22T14:10:41.660 に答える