簡體   English   中英

Select MIN, MAX 對應列基於另一列值

[英]Select MIN, MAX Corresponding column based on another column values

我有下表:

Date        Open        High        Low         Close
1-Oct-19    225.070007  228.220001  224.199997  224.589996
2-Oct-19    223.059998  223.580002  217.929993  218.960007
3-Oct-19    218.429993  220.960007  215.130005  220.820007
4-Oct-19    225.639999  227.490005  223.889999  227.009995
7-Oct-19    226.270004  229.929993  225.839996  227.059998
8-Oct-19    225.820007  228.059998  224.330002  224.399994
9-Oct-19    227.029999  227.789993  225.639999  227.029999
10-Oct-19   227.929993  230.440002  227.300003  230.089996
11-Oct-19   232.949997  237.639999  232.309998  236.210007
14-Oct-19   234.899994  238.130005  234.669998  235.869995
15-Oct-19   236.389999  237.649994  234.880005  235.320007
16-Oct-19   233.369995  235.240005  233.199997  234.369995
17-Oct-19   235.089996  236.149994  233.520004  235.279999
18-Oct-19   234.589996  237.580002  234.289993  236.410004
21-Oct-19   237.520004  240.990005  237.320007  240.509995
22-Oct-19   241.160004  242.199997  239.619995  239.960007
23-Oct-19   242.100006  243.240005  241.220001  243.179993
24-Oct-19   244.509995  244.800003  241.809998  243.580002
25-Oct-19   243.160004  246.729996  242.880005  246.580002
28-Oct-19   247.419998  249.25  246.720001  249.050003
29-Oct-19   248.970001  249.75  242.570007  243.289993
30-Oct-19   244.759995  245.300003  241.210007  243.259995
31-Oct-19   247.240005  249.169998  237.259995  248.759995

對於給定的日期范圍(比如 03Oct19 到 10Oct19 之間),我想獲取 HIGH 列的最大值及其對應的日期值,以及 LOW 列的最小值及其對應的日期。 在上面的例子中,預期的結果應該是

|  MAX(High)  | High-Date |  MIN(Low)  | Min-Date  |
+-------------+-----------+------------+-----------+
|  230.44002  | 10-Oct-19 | 215.130005 | 03-Oct-19 |

我正在嘗試以下查詢:

SELECT max(high)
       , Date
       , min(low)
       , Date 
FROM tbl1 
where date>='2019-10-03' 
and date<='2019-10-10' 
group by date

但是,上面的代碼缺少一些東西,因為它只是返回所有行。

知道還應該使用什么(加入?還是嵌套查詢?)

謝謝

嘗試這樣的事情:

select * from 
(SELECT high as "Max(high)"
       , Date_c as "High-Date"
FROM tbl1 
where Date_c >= '2019-10-03' 
and Date_c <= '2019-10-10' 
And high = (select max(high) from tbl1)) a
cross join
(SELECT low as "MIN(Low)"
       , Date_c as "Min-Date"
FROM tbl1 
where Date_c >= '2019-10-03' 
and Date_c<= '2019-10-10' 
And low = (select min(low) from tbl1)) b

這是 MySQL 5.7 的小演示

或者,如果由於某種原因您有兩行相同並且您只想要一個結果:

select a.high as "Max(high)"
       , a.Date_c "High-Date" 
       , b.low as "MIN(Low)"
       , b.Date_c as "Min-Date"
from 
(SELECT max(high) as "high"
       , max(Date_c) as "Date_c"
FROM tbl1 
where high = (select max(high) 
              from tbl1 
              where Date_c between '2019-10-03' and '2019-10-10')) a
cross join
(SELECT min(low) as "low"
       , max(Date_c) as "Date_c"
FROM tbl1 
where low = (select min(low) 
             from tbl1 
             where Date_c between '2019-10-03' and '2019-10-10')) b

這是演示

這是根據@SalmanA(Cheers:) 建議的代碼:

select A.high as "Max(high)"
       , A.Date_c "High-Date" 
       , B.low as "MIN(Low)"
       , B.Date_c as "Min-Date"
from 
(SELECT High, Date_c 
FROM tbl1
where Date_c between '2019-10-03' and '2019-10-10'
ORDER BY High DESC LIMIT 1) A
CROSS JOIN 
(SELECT Low, Date_c 
FROM tbl1 
where Date_c between '2019-10-03' and '2019-10-10'
ORDER BY Low LIMIT 1
) B;

演示

你可以試試這個:

SELECT
T1.*,T2.*
FROM
(
SELECT  DATE AS  YOUR_MX_DATE,HIGH AS YOUR_HG_VALUE
FROM TBL1 
WHERE   HIGH IN (
SELECT MAX(HIGH) AS MX_VALUE  FROM TBL1 
WHERE   Date >='2019-10-03' 
AND Date <='2019-10-10'  
)
)T1 CROSS JOIN
(
SELECT DATE AS YOUR_MN_DATE,HIGH AS YOUR_MN_VALUE
FROM TBL1 
WHERE LOW IN (
SELECT MIN(LOW) AS MN_VALUE  FROM TBL1 
WHERE   Date >='2019-10-03' 
AND Date <='2019-10-10' 
)
) T2

您首先需要找到指定日期范圍的高低值,然后與主表連接以獲得對應的日期。 結果將有一行(同一日期的最高和最低值)或兩行(兩個日期的最高和最低值)或可能更多行(多個日期的最高或最低值相同)。 使用條件聚合來完善結果:

SELECT MIN(CASE WHEN t.High = v.High THEN t.High END) AS High     -- MIN/MAX does not matter here
     , MIN(CASE WHEN t.High = v.High THEN t.Date END) AS HighDate -- MIN for first date, MAX for last date
     , MIN(CASE WHEN t.Low  = v.Low  THEN t.Low  END) AS Low      -- MIN/MAX does not matter here
     , MIN(CASE WHEN t.Low  = v.Low  THEN t.Date END) AS LowDate  -- MIN for first date, MAX for last date
FROM (
    SELECT MAX(High) AS High
         , MIN(Low) AS Low
    FROM t
    WHERE Date BETWEEN '2019-10-03' AND '2019-10-10' 
) AS v
JOIN t ON t.High = v.High OR t.Low = v.Low
WHERE Date BETWEEN '2019-10-03' AND '2019-10-10'

db<>fiddle 上的演示

您可以使用此查詢來獲得所需的結果。 它找到感興趣期間的MAX(high)MIN(low)值,然后將這些值JOIN回原始表以查找相應的日期。 請注意,我們在日期值上使用MIN()以避免超過一天出現高/低值的情況; 這給出了它發生的最早日期。 如果您想要出現高/低值的最新日期,請將其更改為MAX()

SELECT hl.high, 
       MIN(t1.date) AS high_date, 
       hl.low, 
       MIN(t2.date) AS low_date
FROM (SELECT MAX(high) AS high, MIN(low) AS low
      FROM tbl1
      WHERE `Date` BETWEEN '2019-10-03' AND '2019-10-10') hl
JOIN tbl1 t1 ON t1.high = hl.high AND t1.date BETWEEN '2019-10-03' AND '2019-10-10'
JOIN tbl1 t2 ON t2.low = hl.low AND t2.date BETWEEN '2019-10-03' AND '2019-10-10'
GROUP BY hl.high, hl.low

Output:

high    low     high_date   low_date
230.44  215.13  2019-10-10  2019-10-03

dbfiddle 上的演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM