我知道这已经被问到了。但是,我在SQL和MySQL方面相对较新,所以我对其他答案感到困惑。
说我有一张历史财务数据表,我有多条记录。
Date | Close Price | % Change
2014-03-25 | 3.58 | ?
2014-03-24 | 3.57 | ?
2014-03-21 | 3.61 | ?
我在表格中有日期和收盘价。我希望每天都能找到%的变化。例如,2014-03-24至2014-03-25约为+ 0.28%。
我完全坚持如何在不运行大量单个查询的情况下为所有记录执行此操作。我认为它是某种加入,但这是我感到困惑的地方,因为我之前没有这样做过。
答案 0 :(得分:6)
像我这样的事情我会这样做
SELECT x.Date, x.Close_Price, (((x.Close_Price / y.Close_Price) - 1) * 100) AS '% Change'
FROM
(
SELECT a.Date AS aDate, MAX(b.Date) AS aPrevDate
FROM SomeTable a
INNER JOIN SomeTable b
WHERE a.Date > b.Date
GROUP BY a.Date
) Sub1
INNER JOIN SomeTable x ON Sub1.aDate = x.Date
INNER JOIN SomeTable y ON Sub1.aPrevDate = y.Date
ORDER BY x.Close_Price DESC
当天不是一个接一个的时候(例如,非处理日的缺失记录),这将会应付。
子查询获取每个日期,以及小于它的最大日期。然后将其连接到表以获取该日期和前一个日期的完整记录,然后可以进行计算。
编辑 - 并根据此SELECT进行更新: -
UPDATE treasury x
INNER JOIN
(
SELECT a.Date AS aDate, MAX(b.Date) AS aPrevDate
FROM treasury a
INNER JOIN treasury b
WHERE a.Date > b.Date
GROUP BY a.Date
) Sub1 ON Sub1.aDate = x.Date
INNER JOIN treasury y ON Sub1.aPrevDate = y.Date
SET x.PercentChange = (((x.Close_Price / y.Close_Price) - 1) * 100)
答案 1 :(得分:2)
Select S1.Date as Today, (S1.ClosePrice - S2.ClosePrice) / S2.ClosePrice as Change
FROM Stock as S1 INNER JOIN Stock as S2
ON S1.Date = (S2.Date+1)
答案 2 :(得分:1)
Postgresql有一个方便的窗口功能
update tblTableName
set siteUrl = String_Split(ColumnName,'/')[1] + String_Split(ColumnName,'/')[0]
where `String_Split(ColumnName,'/')[1] like '%112%'
这简化了这个问题(正如我刚刚发现的那样)
lag(value anyelement [, offset integer [, default anyelement ]])