查找每个相同开始周和结束周的最大值和最小值

问题描述 投票:0回答:5

我正在尝试实现一个查询,但我在尝试找到每周的最大值和最小值方面没有取得太大成功。

我有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;

enter image description here 您会注意到每周的最大值和最小值保持大致相同并且不会变化,因为每周的最高点和最低点应该有所不同。

mysql sql
5个回答
1
投票

SQL 小提琴

我在示例中缩写了您的一些名字。

获取每周的最高点和最低点非常简单;你只需要使用 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 |

1
投票

要获取全局高点和低点,只需从原始查询中删除

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 |

1
投票

周表似乎完全多余......

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


0
投票

检查以下查询是否产生所需的结果:

    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)

0
投票

这可以在一定程度上解决您的问题:) 也包括月份和年份的最小值和最大值

选择不同的 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 订购

© www.soinside.com 2019 - 2024. All rights reserved.