我需要从日志中制作图表。日志条目不是定期的。
我想在日期之间选择行以及在开始日期之前的值(即从输入立即前一个日志的时间开始)。
所以,让我们说:
表Foo
包含id
和value
列,
表Bar
包含id
,foo_id
和value
列,
表BarLog
包含id
,foo_id
,bar_id
,bar_value
和timestamp
。
因此,一个Foo可以有很多条形码。
我需要所有Bar中所有Bar的所有行,例如foo_id
和07/01/2012
之间的07/31/2012
以及每个Bar的值(行){{1 }}
希望有意义,如果没有,我会尽力澄清。
编辑(左上方为上下文):
让我们简化这一步骤。如果我有一个包含两个外键的表07/01/2012
和fk_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行更新。
再次感谢。
答案 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
的最新内容
原始问题只是一个简单的日期之间的联合