首页 > 解决方案 > SQL 查询 - 如何将此 excel 公式转换为查询

问题描述

我有一个现有的 excel 公式。逻辑是这样的:

  1. 当表 2“日期/时间”上的日期大于表 1“Open_Date”时开始查找
  2. 当表 2“日期/时间”上的日期小于表 1“Close_Date”时停止查找
  3. 如果表 1“Action”显示“买入”,则查找表 2“低”小于表 1 列 L“FixedSL”的位置。
  4. 如果表 1“Action”显示“卖出”,则查找表 2“高”小于表 1 列 L“FixedSL”的位置。
  5. 如果找到匹配项,则返回表 2 中的“日期/时间”并覆盖该行的表 1“Time_Hit_Fixed_SL”中的值。

以下是数据表的示例: 表 1

Open_Date,       Close_Date,   Action, FixedSL,  Time_Hit_Fixed_SL
6/1/2020 3:56,  6/1/2020 4:24,  Buy,   1.8502,   6/1/2020 5:01
6/1/2020 4:44,  6/1/2020 8:19,  Sell,  1.8411,   6/1/2020 10:12
6/1/2020 8:22,  6/1/2020 8:54,  Sell,  1.8335,   6/1/2020 10:12

表 2

Date/Time,        Open,     High,     Low,    Close
06/01/2020 03:57,  1.8503,  1.8503,  1.8501,  1.8501
06/01/2020 03:58,  1.8501,  1.8503,  1.8501,  1.8502
06/01/2020 03:59,  1.8501,  1.8504,  1.8501,  1.8504
06/01/2020 04:00,  1.8501,  1.8505,  1.8501,  1.8503
06/01/2020 04:01,  1.8504,  1.8504,  1.8504,  1.8504

表 1 第一行的论坛输出将是 06/01/2020 03:57 覆盖“Time_Hit_Fixed_SL”列中的现有值。

我想要完成的是在 SQL 中使用 2 个表中的数据执行相同的操作。

我是 SQL 新手并进行了搜索,但找不到正确的方向来获得从哪里开始编写查询以替换高级 excel 公式逻辑的指导。感谢您的帮助和指导!

标签: sqlexcelsqlitesql-update

解决方案


您可以使用窗口函数MIN()来获取列的值Date/Time

如果您想要一个SELECT返回预期结果的语句:

SELECT DISTINCT t1.Open_Date, t1.Close_Date, t1.Action,  
  COALESCE(
    MIN(
      CASE t1.Action
        WHEN 'Buy' THEN CASE WHEN t2.Low < t1.FixedSL THEN t2.Date_Time END
        WHEN 'Sell' THEN CASE WHEN t2.High < t1.FixedSL THEN t2.Date_Time END
      END
    )
    OVER (PARTITION BY t1.Open_Date, t1.Close_Date),
    t1.Time_Hit_Fixed_SL
  ) Time_Hit_Fixed_SL
FROM Table1 t1 LEFT JOIN Table2 t2
ON t2.Date_Time > t1.Open_Date AND t2.Date_Time < t1.Close_Date

如果你想更新Table1

UPDATE Table1 AS t1
SET Time_Hit_Fixed_SL = COALESCE(
  (
    SELECT 
      MIN(
        CASE t1.Action
          WHEN 'Buy' THEN CASE WHEN t2.Low < t1.FixedSL THEN t2.Date_Time END
          WHEN 'Sell' THEN CASE WHEN t2.High < t1.FixedSL THEN t2.Date_Time END
        END
      )
    FROM Table2 t2  
    WHERE t2.Date_Time > t1.Open_Date AND t2.Date_Time < t1.Close_Date
  ),
  t1.Time_Hit_Fixed_SL
)

请参阅演示


推荐阅读