我正在尝试实现一个查询,但我在尝试找到每周的最大值和最小值方面没有取得太大成功。
我有2张桌子:
SYMBOL_DATA(包含开盘价、最高价、最低价、收盘价和成交量) WEEKLY_LOOKUP(包含带有 WEEK_START 和 WEEK_END 的周列表(无周末))
**SYMBOL_DATA Example:**
OPEN, HIGH, LOW, CLOSE, VOLUME
23.22 26.99 21.45 22.49 34324995
WEEKLY_LOOKUP(包含带有 WEEK_START 和 WEEK_END 的周列表(无周末))
**WEEKLY_LOOKUP Example:**
WEEK_START WEEK_END
2016-01-25 2016-01-29
2016-01-18 2016-01-22
2016-01-11 2016-01-15
2016-01-04 2016-01-08
我正在尝试查找每个WEEK_START和WEEK_END该特定周的最高点和最低点。
例如,如果周是 WEEK_START=2016-01-11 和 WEEK_END=2016-01-15,我会 列出了该特定符号的 5 个条目:
DATE HIGH LOW
2016-01-15 96.38 93.54
2016-01-14 98.87 92.45
2016-01-13 100.50 95.21
2016-01-12 99.96 97.55
2016-01-11 98.60 95.39
2016-01-08 100.50 97.03
2016-01-07 101.43 97.30
2016-01-06 103.77 100.90
2016-01-05 103.71 101.67
2016-01-04 102.24 99.76
对于每个截至日期 (2016-01-15) 的最高价为 2016-01-13 的 100.50,最低价为 2016-01-14 的 92.45
我尝试编写一个查询来提供高点和低点列表,但是当我尝试添加 MAX(HIGH) 时,我只返回了 1 行。 我尝试了一些无法让查询工作的事情(某种无限运行类型)。目前,我只是提供了每天的高点和低点列表,而不是每周的汇总,我不知道该怎么做。
select date, t1.high, t1.low
from SYMBOL_DATA t1, WEEKLY_LOOKUP t2
where symbol='ABCDE' and (t1.date>=t2.START_DATE and t1.date<=t2.END_DATE)
and t1.date<=CURDATE()
LIMIT 30;
如何获取每周(开始和结束)的 High_Date、MAX(High) 和 Low_Date、MIN(LOW)? 我可能不需要 符号的完整历史记录,因此 30 或(30 周周期)的 LIMIT 就足够了,这样我就可以看到趋势。
如果我想知道例如每周 MAX(高)和 MIN(低)开始周结束 2016-01-15 结果将显示
**Result:**
WEEK_ENDING 2016-01-15 100.50 2016-01-13 92.45 2016-01-14
WEEK_ENDING 2016-01-08 103.77 2016-01-06 97.03 2016-01-08
etc
etc
感谢你们所有人的专业知识和专业知识。我非常感谢您的帮助。
编辑 一旦返回包含每周的 MAX(HIGH) 和 MIN(LOW) 的周结束列表,是否有可能如何从该结果集中找到 MAX(HIGH) 和 MIN(LOW),以便仅返回 1从30周开始进入? 谢谢!
致皮奥特尔
select part1.end_date,part1.min_l,part1.max_h, s1.date, part1.min_l,s2.date from
(
select t2.start_date, t2.end_date, max(t1.high) max_h, min(t1.low) min_l
from SYMBOL_DATA t1, WEEKLY_LOOKUP t2
where symbol='FB'
and t1.date<='2016-01-22'
and (t1.date>=t2.START_DATE and t1.date<=t2.END_DATE)
group by t2.start_date, t2.end_date order by t1.date DESC LIMIT 1;
) part1, symbol_data s1, symbol_data s2
where part1.max_h = s1.high and part1.min_l = s2.low;
我在示例中缩写了您的一些名字。
获取每周的最高点和最低点非常简单;你只需要使用 GROUP BY:
SELECT s1.symbol, w.week_end, MAX(s1.high) AS weekly_high, MIN(s1.LOW) as weekly_low
FROM weeks AS w
INNER JOIN symdata AS s1 ON s1.zdate BETWEEN w.week_start AND w.week_end
GROUP BY s1.symbol, w.week_end
结果:
| symbol | week_end | weekly_high | weekly_low |
|--------|---------------------------|-------------|------------|
| ABCD | January, 08 2016 00:00:00 | 103.77 | 97.03 |
| ABCD | January, 15 2016 00:00:00 | 100.5 | 92.45 |
不幸的是,获取最高价和最低价的日期需要您根据交易品种、周和值重新加入到 symbol_data 表中。 即使 that 也不起作用;您必须考虑到可能有两天达到相同的高点(或低点)的可能性,并决定选择哪一天。 我随意选择了高点和低点一周中的第一次出现。 因此,要获得第二级选择,您需要另一个 GROUP BY。 整个事情看起来像这样:
SELECT wl.symbol, wl.week_end, wl.weekly_high, MIN(hd.zdate) as high_date, wl.weekly_low, MIN(ld.zdate) as low_date
FROM (
SELECT s1.symbol, w.week_start, w.week_end, MAX(s1.high) AS weekly_high, MIN(s1.low) as weekly_low
FROM weeks AS w
INNER JOIN symdata AS s1 ON s1.zdate BETWEEN w.week_start AND w.week_end
GROUP BY s1.symbol, w.week_end) AS wl
INNER JOIN symdata AS hd
ON hd.zdate BETWEEN wl.week_start AND wl.week_end
AND hd.symbol = wl.symbol
AND hd.high = wl.weekly_high
INNER JOIN symdata AS ld
ON ld.zdate BETWEEN wl.week_start AND wl.week_end
AND ld.symbol = wl.symbol
AND ld.low = wl.weekly_low
GROUP BY wl.symbol, wl.week_start, wl.week_end, wl.weekly_high, wl.weekly_low
结果:
| symbol | week_end | weekly_high | high_date | weekly_low | low_date |
|--------|---------------------------|-------------|---------------------------|------------|---------------------------|
| ABCD | January, 08 2016 00:00:00 | 103.77 | January, 06 2016 00:00:00 | 97.03 | January, 08 2016 00:00:00 |
| ABCD | January, 15 2016 00:00:00 | 100.5 | January, 13 2016 00:00:00 | 92.45 | January, 14 2016 00:00:00 |
要获取全局高点和低点,只需从原始查询中删除
weekly
表即可:
SELECT wl.symbol, wl.high, MIN(hd.zdate) as high_date, wl.low, MIN(ld.zdate) as low_date
FROM (
SELECT s1.symbol, MAX(s1.high) AS high, MIN(s1.low) as low
FROM symdata AS s1
GROUP BY s1.symbol) AS wl
INNER JOIN symdata AS hd
ON hd.symbol = wl.symbol
AND hd.high = wl.high
INNER JOIN symdata AS ld
ON ld.symbol = wl.symbol
AND ld.low = wl.low
GROUP BY wl.symbol, wl.high, wl.low
结果:
| symbol | high | high_date | low | low_date |
|--------|--------|---------------------------|-------|---------------------------|
| ABCD | 103.77 | January, 06 2016 00:00:00 | 92.45 | January, 14 2016 00:00:00 |
周表似乎完全多余......
SELECT symbol
, WEEK(zdate)
, MIN(low) min
, MAX(high) max_high
FROM symdata
GROUP
BY symbol, WEEK(zdate);
这是一个简化的示例。实际上,您可以使用 DATE_FORMAT 或类似的东西。 http://sqlfiddle.com/#!9/c247f/3
检查以下查询是否产生所需的结果:
select part1.end_date,part1.min_l,part1.max_h, s1.date, part1.min_l,s2.date from
(
select t2.start_date, t2.end_date, max(t1.high) max_h, min(t1.low) min_l
from SYMBOL_DATA t1, WEEKLY_LOOKUP t2
where symbol='ABCDE'
and (t1.date>=t2.START_DATE and t1.date<=t2.END_DATE)
group by t2.start_date, t2.end_date
) part1, symbol_data s1, symbol_data s2
where part1.max_h = s1.high and part1.min_l = s2.low
and (s1.date >= part1.start_date and part1.end_date)
and (s2.date >= part1.start_date and part1.end_date)
这可以在一定程度上解决您的问题:) 也包括月份和年份的最小值和最大值
选择不同的 TRADING_DATE ,Min(TRADING_DATE) OVER (PARTITION BY Year(TRADING_DATE), MONTH(TRADING_DATE)) AS MIN_MONTH_TRADINGDATE ,最大(TRADING_DATE) OVER (按年(TRADING_DATE)、月(TRADING_DATE)) AS MAX_MONTH_TRADINGDATE 划分 ,Min(TRADING_DATE) OVER (PARTITION BY Year(TRADING_DATE), MONTH(TRADING_DATE), DATEPART(week,TRADING_DATE)) AS MIN_WEEK_TRADINGDATE ,Max(TRADING_DATE) OVER (PARTITION BY Year(TRADING_DATE), MONTH(TRADING_DATE), DATEPART(week,TRADING_DATE)) AS MAX_WEEK_TRADINGDATE ,Min(TRADING_DATE) OVER (PARTITION BY Year(TRADING_DATE)) AS MIN_YEAR_TRADINGDATE ,最大(TRADING_DATE) OVER (按年(TRADING_DATE)分区) AS MAX_YEAR_TRADINGDATE 来自 [ShareAnalysis].[dbo].[STOCK_INDICATORS] 年份(TRADING_DATE)=2024 按 TRADING_DATE DESC 订购