选择日期和初始值

时间:2012-08-20 21:01:36

标签: sql sql-server database

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

我想在日期之间选择行以及在开始日期之前的值(即从输入立即前一个日志的时间开始)。

所以,让我们说:

Foo包含idvalue列,

Bar包含idfoo_idvalue列,

BarLog包含idfoo_idbar_idbar_valuetimestamp

因此,一个Foo可以有很多条形码。

我需要所有Bar中所有Bar的所有行,例如foo_id07/01/2012之间的07/31/2012以及每个Bar的值(行){{1 }}

希望有意义,如果没有,我会尽力澄清。


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

让我们简化这一步骤。如果我有一个包含两个外键的表07/01/2012fk_a以及fk_b,我怎样才能获得具有给定timestamp和distict {{{{ {1}}。

正如所建议的,这是一个例子。

fk_a

如果fk_b为1,我会想要第3行和第5行。所以只查看行1,3和5(+----+------+------+-------------+ | 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 | +----+------+------+-------------+ 为1的行),获取最新的fk_a(其中第3行比{1}}的第1行更新。

再次感谢。

3 个答案:

答案 0 :(得分: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中进行绘图。无论如何,希望上面的查询可以让您更接近您想要做的事情。

答案 1 :(得分: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个月。

答案 2 :(得分:0)

最后发现this question有我想要的东西。基本上只是加入一个分组选择。所以我编辑的答案就像是

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的最新内容

原始问题只是一个简单的日期之间的联合

相关问题