-1

我需要从日志中制作图表。日志条目不是定期的。

我想选择日期之间的行以及开始日期之前的值(即,从输入紧接在前的日志开始)。

所以,让我们说:

Fooidvalue列,

Baridfoo_idvalue列,并且

BarLogid, foo_id, bar_id,bar_valuetimestamp.

所以一个Foo可以有很多条。

我需要来自 BarLog 的所有 Bars 的所有行,foo_id例如在 和 之间, 07/01/2012以及07/31/2012每个 Bar 的值(行),因为它是 on 07/01/2012

希望这是有道理的,如果没有,我会尽力澄清。


编辑(左上方的上下文):

让我们再简化一步。如果我有一个带有两个外键fk_aandfk_b和 a的表,我怎样才能获得带有给定和 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 行(具有fk_a1 的行),获取每个中的最新fk_b(其中第 3 行比第 1 行更新fk_b=1)。

再次感谢。

4

3 回答 3

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、日期戳值、日期戳

日期戳一次增加 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

最初的问题只是在日期之间有一个简单的 get 的结合

于 2012-08-22T14:10:41.660 回答
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 回答