sql-server - 如何在 2 个带有 GROUP 的 SELECT 语句之间创建 JOIN?

标签 sql-server inner-join

我有一个包含每日股票数据的表格,我想按周汇总。每天的表是:

CREATE TABLE [dbo].[TempDaily] (
    [Symbol]    CHAR (10)  NOT NULL,
    [CloseDate] DATE       NOT NULL,
    [DailyHi]   FLOAT (53) NULL,
    [DailyLow]  FLOAT (53) NULL,
    [AdjClose]  FLOAT (53) NOT NULL,
    [WeekEnd]   DATE       NULL
);

我想在周表中插入一周的总结:

CREATE TABLE [dbo].[Weekly] (
    [Symbol]    CHAR (10)  NOT NULL,
    [WeekEnd]   DATE       NOT NULL,
    [WeeklyHi]  FLOAT (53) NOT NULL,
    [WeeklyLow] FLOAT (53) NOT NULL,
    [AdjClose]  FLOAT (53) NULL
);

[AdjClose] 列设置为允许空值,因为我当前的解决方法是先插入其他 4 列,然后使用第三张表中的每周 AdjClose 值更新每周表,这真的很慢。

将前 4 列的每周数据放入表中很简单:

strSQL = "INSERT INTO Weekly (Symbol, WeekEnd, WeeklyHi, WeeklyLow) " &
    "SELECT Symbol, WeekEnd, MAX(DailyHi), MIN(DailyLow) " &
     "FROM TempDaily " &
     "GROUP BY Symbol, WeekEnd "

获取每周 AdjClose 并不那么简单,但我可以将数据插入临时表,然后从中更新每周表:

strSQL = "INSERT INTO Test (WeekEnd, AdjClose) " &
    "Select wdata.WeekEnd, MAX(wdata.AdjClose) " &
    "FROM " &
        "(Select CloseDate, WeekEnd, " &
        "FIRST_VALUE(AdjClose) OVER (PARTITION BY WeekEnd ORDER BY CloseDate                                            
         DESC ROWS UNBOUNDED PRECEDING) As AdjClose " &
         "FROM TempDaily) wdata " &
     "GROUP BY wdata.WeekEnd "

我真的更愿意用一条语句将所有 5 列的数据插入到 Weekly 表中,而不是求助于我笨拙的解决方法,但我一直无法弄清楚如何连接这 2 个语句。

Daily 表中的数据采用以下格式(为清楚起见添加了空格):

Symbol,    CloseDate,  DailyHi,DailyLow,AdjClose,   WeekEnd
AAPL      ,5/31/2019,   177.99,  175.00,  175.07,  6/1/2019
AAPL      ,5/30/2019,   179.23,  176.67,  178.30,  6/1/2019
AAPL      ,5/29/2019,   179.35,  176.00,  177.38,  6/1/2019
AAPL      ,5/28/2019,   180.59,  177.91,  178.23,  6/1/2019
AAPL      ,5/24/2019,   182.14,  178.62,  178.97,  5/25/2019
AAPL      ,5/23/2019,   180.54,  177.81,  179.66,  5/25/2019
AAPL      ,5/22/2019,   185.71,  182.55,  182.78,  5/25/2019
AAPL      ,5/21/2019,   188.00,  184.70,  186.60,  5/25/2019
AAPL      ,5/20/2019,   184.35,  180.28,  183.09,  5/25/2019

周表应该以:

Symbol,        WeekEnd, WeeklyHi, WeeklyLo,  AdjClose
AAPL      ,   6/1/2019,   180.59,   175.00,   175.07
AAPL      ,   5/25/2019,  188.00,   177.81,   178.97

我正在将 MS Access 数据库转换为 VB.NET,并认为这将是一个相当简单的移植。差异比我预期的要多得多。感谢您的帮助。

下面介绍的解决方案是我尝试过的解决方案,但它会生成一个 SQLException:''(' 附近的语法不正确。'wdata' 附近的语法不正确。所以我仍在尝试解决这个问题。

strSQL = "INSERT INTO Weekly (Symbol, WeekEnd, WeeklyHi, WeeklyLow, AdjClose) " &
"Select A.Symbol, A.WeekEnd, A.WeeklyHi, A.WeeklyLow, ISNULL(B.AdjClose, 0) as AdjClose " &
"FROM " &
    "(SELECT Symbol, WeekEnd, MAX(DailyHi) as WeeklyHi, MIN(DailyLow) as WeeklyLow " &
     "FROM TempDaily " &
     "GROUP BY Symbol, WeekEnd ) A " &
     "LEFT JOIN " & 
    "(Select wdata.WeekEnd, MAX(wdata.AdjClose) as AdjClose" &
    "FROM " &
        "(Select CloseDate, WeekEnd, " &
        "FIRST_VALUE(AdjClose) OVER (PARTITION BY WeekEnd ORDER BY CloseDate                                            
         DESC ROWS UNBOUNDED PRECEDING) As AdjClose " &
         "FROM TempDaily) wdata " &
     "GROUP BY wdata.WeekEnd) B ON A.WeekEnd = B.WeekEnd "

最佳答案

我认为你可以做你想做的,像这样加入他们(更新):

    strSQL = "INSERT INTO Weekly (Symbol, WeekEnd, WeeklyHi, WeeklyLow, AdjClose) " &
"Select A.Symbol, A.WeekEnd, A.WeeklyHi, A.WeeklyLow, ISNULL(B.AdjClose, 0) as AdjClose " &
"FROM " &
    "(SELECT Symbol, WeekEnd, MAX(DailyHi) as WeeklyHi, MIN(DailyLow) as WeeklyLow " &
    "FROM TempDaily " &
    "GROUP BY Symbol, WeekEnd ) A " &
    "LEFT JOIN " &
    "(Select wdata.WeekEnd, MAX(wdata.AdjClose) as AdjClose " &
    "FROM " &
        "(Select CloseDate, WeekEnd, " &
        "FIRST_VALUE(AdjClose) OVER (PARTITION BY WeekEnd ORDER BY CloseDate " &
        "DESC ROWS UNBOUNDED PRECEDING) As AdjClose " &
        "FROM TempDaily) wdata " &
     "GROUP BY wdata.WeekEnd) B ON A.WeekEnd = B.WeekEnd "

关于sql-server - 如何在 2 个带有 GROUP 的 SELECT 语句之间创建 JOIN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56418461/

相关文章:

sql-server - 为什么这个子查询不起作用? SQL Server初学者练习案例

c# - 如何使用 Entity Framework 在动态构建的查询中按实体键获取行索引

c# - 在 C#、SQL Server : trying to update if value already present else insert 中执行查询时出错

MySQL Inner Join 没有返回正确的值

c# - 同步 c#/asp.net 预订应用程序

sql - 将所有与不存在的并入并插入

Mysql 查询 - JOIN 语句

mysql - 内部连接不起作用

php - 没有重复记录的内部连接

mysql - MariaDB 更新报错 inner join 和 select