Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取过去X周的数据时,子查询的列太多错误?_Sql_Amazon Web Services_Amazon Redshift - Fatal编程技术网

Sql 获取过去X周的数据时,子查询的列太多错误?

Sql 获取过去X周的数据时,子查询的列太多错误?,sql,amazon-web-services,amazon-redshift,Sql,Amazon Web Services,Amazon Redshift,我有下面的查询,它提供了我上周的数据,如下所示。它使用内部子查询中使用的week_number列返回具有以下列的数据:前一周的类型、金额和总计 select type, case WHEN (type = 'PROC1' AND code = 'UIT') THEN 450 WHEN (type = 'PROC1' AND code = 'KJH') THEN 900 WHEN (type = 'PROC2' AND code = 'LOP') THEN 8840 WHEN (type = 'P

我有下面的查询,它提供了我上周的数据,如下所示。它使用内部子查询中使用的week_number列返回具有以下列的数据:前一周的类型、金额和总计

select type,
case
WHEN (type = 'PROC1' AND code = 'UIT') THEN 450
WHEN (type = 'PROC1' AND code = 'KJH') THEN 900
WHEN (type = 'PROC2' AND code = 'LOP') THEN 8840
WHEN (type = 'PROC2' AND code = 'AWE') THEN 1490
WHEN (type = 'PROC3' AND code = 'MNH') THEN 1600
WHEN (type = 'PROC3' AND code = 'LKP') THEN 1900
END as amount,
total
from xyz.orders pa
join
(select clientid as clientid, max(version) as version
from xyz.orders where consumerid IN (select distinct entity_id from abc.items
where week_number = extract(week from current_date) - 1
and item_type like '%Ionize - Data%' )
and createdfor ='BLOCK'
and holder='RELAY_FUTURES'
group by clientid) pb on
pa.clientid = pb.clientid and pa.version = pb.version;
以下是截至目前为止我通过上一周的上述查询返回的输出:

type    amount      total
---------------------------
PROC1    450         1768
PROC1    900         123
PROC1    450         456
PROC2    8840        99897
PROC2    1490        2223
PROC2    8840        9876
PROC3    1900        23456
PROC3    1600        12498
PROC3    1600        28756
在我上面的查询中,我有如下所示的内部子查询,它返回前一周的数据,然后在外部查询中使用该数据的输出

select distinct entity_id from abc.items
where week_number = extract(week from current_date) - 1
and item_type like '%Ionize - Data%'
现在,我正试图找出一种方法,通过这种方法,我可以获得过去6周的数据,不包括本周的数据,也可以按每周分组,因此我认为我们需要修改上述内部查询,以便它可以为我提供过去6周的数据,然后在外部查询中以某种方式按每周分组。基本上,我想得到的金额,在过去6周内每种类型的总额如下所示。不知何故,我还需要在最终输出中添加week_number列

预期产量

所以我通过修改内部子查询尝试了下面的查询,但它给了我一个错误,因为操作无效:子查询有太多的列。知道我在这里干什么吗

select type,
case
WHEN (type = 'PROC1' AND code = 'UIT') THEN 450
WHEN (type = 'PROC1' AND code = 'KJH') THEN 900
WHEN (type = 'PROC2' AND code = 'LOP') THEN 8840
WHEN (type = 'PROC2' AND code = 'AWE') THEN 1490
WHEN (type = 'PROC3' AND code = 'MNH') THEN 1600
WHEN (type = 'PROC3' AND code = 'LKP') THEN 1900
END as amount,
total
from xyz.orders pa
join
(select clientid as clientid, max(version) as version
from xyz.orders where consumerid IN (select week_number, entity_id from abc.items
where week_number >= extract(week from current_date) - 6 
  and week_number <= extract(week from current_date) - 1
  and item_type like '%Ionize - Data%'
order by week_number desc )
and createdfor ='BLOCK'
and holder='RELAY_FUTURES'
group by clientid) pb on
pa.clientid = pb.clientid and pa.version = pb.version;
我修改了我的内部查询,如下所示:

select week_number, entity_id from abc.items
where week_number >= extract(week from current_date) - 6 
  and week_number <= extract(week from current_date) - 1
  and item_type like '%Ionize - Data%'
order by week_number desc

可能是我在实现所需输出时做的完全错误,因此我们将感谢您的帮助。

Andy问题在于WHERE子句

where consumerid IN (select week_number, entity_id from abc.items
where week_number >= extract(week from current_date) - 6 
  and week_number <= extract(week from current_date) - 1
  and item_type like '%Ionize - Data%'
order by week_number desc )
因为子句正在查看consumerid是否是子查询产生的列表的成员。但是,此子查询返回2列,Redshift无法将1列与2列进行比较。只需从select中删除week_number,此错误将得到解决

where consumerid IN (select entity_id from abc.items
where week_number >= extract(week from current_date) - 6 
  and week_number <= extract(week from current_date) - 1
  and item_type like '%Ionize - Data%'
order by week_number desc )

安迪:问题在于WHERE子句

where consumerid IN (select week_number, entity_id from abc.items
where week_number >= extract(week from current_date) - 6 
  and week_number <= extract(week from current_date) - 1
  and item_type like '%Ionize - Data%'
order by week_number desc )
因为子句正在查看consumerid是否是子查询产生的列表的成员。但是,此子查询返回2列,Redshift无法将1列与2列进行比较。只需从select中删除week_number,此错误将得到解决

where consumerid IN (select entity_id from abc.items
where week_number >= extract(week from current_date) - 6 
  and week_number <= extract(week from current_date) - 1
  and item_type like '%Ionize - Data%'
order by week_number desc )

下面的代码应该足够了-但是没有使用红移解释器进行测试

周号:将IN替换为join,并按如下所示选择周号。 现在还不完全清楚你要找的是哪一周的号码。对于局外人来说,检索max版本是为了 5周的时间段,因此如果xyz.orders上的记录有第45周,则以下查询中检索到的最大版本将为 第39周-第44周。 因此,下面的查询应显示以下内容:

Week 45, 
Type, 
Amount for latest in Week 39 - Week 44, 
Total. 
负周数-请参阅下面的注释代码

With Maxfor5WeekPeriod as 
(
    select 
        MaxVersions.week_number,
        O.clientid as clientid, 
        max(O.version) as version
    from xyz.orders O
    join
    (
        select 
            entity_id,
            week_number
        from abc.items
        where 
        --Something like this should resolve your start of year issue. 
        date_part(w,dateadd(week,-6,current_date)) >= week_number 
        and date_part(w,dateadd(week,-1,current_date)) <= week_number
        and item_type like '%Ionize - Data%'
    ) MaxVersions on 
    entity_id = Consumerid 
    and O.createdfor ='BLOCK'
    and O.holder='RELAY_FUTURES'
    group by O.clientid,MaxVersions.week_number
)
select 
    M.week_number, 
    pa.type,
    case
    WHEN (pa.type = 'PROC1' AND contractdomicilecode = 'UIT') THEN 450
    WHEN (pa.type = 'PROC1' AND contractdomicilecode = 'KJH') THEN 900
    WHEN (pa.type = 'PROC2' AND contractdomicilecode = 'LOP') THEN 8840
    WHEN (pa.type = 'PROC2' AND contractdomicilecode = 'AWE') THEN 1490
    WHEN (pa.type = 'PROC3' AND contractdomicilecode = 'MNH') THEN 1600
    WHEN (pa.type = 'PROC3' AND contractdomicilecode = 'LKP') THEN 1900
    END as amount,
    pa.total
from 
xyz.orders pa
join Maxfor5WeekPeriod M 
on pa.clientid = M.clientid and 
pa.version = M.version

一般要点:红移文档包括对常用表表达式的引用-它们会使代码更加整洁。答案确实从其他贡献者的早期澄清中获得了显著的好处。但是,请注意,我对红移不太熟悉。

下面的代码应该足够了-但是没有使用红移解释器进行测试

周号:将IN替换为join,并按如下所示选择周号。 现在还不完全清楚你要找的是哪一周的号码。对于局外人来说,检索max版本是为了 5周的时间段,因此如果xyz.orders上的记录有第45周,则以下查询中检索到的最大版本将为 第39周-第44周。 因此,下面的查询应显示以下内容:

Week 45, 
Type, 
Amount for latest in Week 39 - Week 44, 
Total. 
负周数-请参阅下面的注释代码

With Maxfor5WeekPeriod as 
(
    select 
        MaxVersions.week_number,
        O.clientid as clientid, 
        max(O.version) as version
    from xyz.orders O
    join
    (
        select 
            entity_id,
            week_number
        from abc.items
        where 
        --Something like this should resolve your start of year issue. 
        date_part(w,dateadd(week,-6,current_date)) >= week_number 
        and date_part(w,dateadd(week,-1,current_date)) <= week_number
        and item_type like '%Ionize - Data%'
    ) MaxVersions on 
    entity_id = Consumerid 
    and O.createdfor ='BLOCK'
    and O.holder='RELAY_FUTURES'
    group by O.clientid,MaxVersions.week_number
)
select 
    M.week_number, 
    pa.type,
    case
    WHEN (pa.type = 'PROC1' AND contractdomicilecode = 'UIT') THEN 450
    WHEN (pa.type = 'PROC1' AND contractdomicilecode = 'KJH') THEN 900
    WHEN (pa.type = 'PROC2' AND contractdomicilecode = 'LOP') THEN 8840
    WHEN (pa.type = 'PROC2' AND contractdomicilecode = 'AWE') THEN 1490
    WHEN (pa.type = 'PROC3' AND contractdomicilecode = 'MNH') THEN 1600
    WHEN (pa.type = 'PROC3' AND contractdomicilecode = 'LKP') THEN 1900
    END as amount,
    pa.total
from 
xyz.orders pa
join Maxfor5WeekPeriod M 
on pa.clientid = M.clientid and 
pa.version = M.version

一般要点:红移文档包括对常用表表达式的引用-它们会使代码更加整洁。答案确实从其他贡献者的早期澄清中获得了显著的好处。但是,请注意,我不熟悉红移。

获取过去6周的所有不同实体id、周号组合。表1

SELECT DISTINCT entity_id, week_number
       FROM abc.items
       WHERE week_number >= Extract(week FROM CURRENT_DATE) - 6
         AND week_number <= Extract(week FROM CURRENT_DATE) - 1
         AND item_type LIKE '%Ionize - Data%'
连接以上两个表以获取clientId、version和Week Number

select xo.clientid    AS clientid,
             xo.version     AS version,
             ai.week_number as week_number from (SELECT DISTINCT entity_id, week_number
       FROM abc.items
       WHERE week_number >= Extract(week FROM CURRENT_DATE) - 6
         AND week_number <= Extract(week FROM CURRENT_DATE) - 1
         AND item_type LIKE '%Ionize - Data%')
         ai LEFT JOIN
         (SELECT clientid     AS clientid,
                 Max(version) AS version,
                 consumerid
          FROM xyz.orders
          WHERE createdfor = 'BLOCK'
            AND holder = 'RELAY_FUTURES'
          GROUP BY consumerid, clientid) xo
      ON ai.entity_id = xo.consumerid
Left join用于放弃表1中不存在的所有使用者id

将上述查询用作内部查询

SELECT pb.week_number,
       pa.type,
       CASE
           WHEN (type = 'PROC1'
               AND contractdomicilecode = 'UIT') THEN 450
           WHEN (type = 'PROC1'
               AND contractdomicilecode = 'KJH') THEN 900
           WHEN (type = 'PROC2'
               AND contractdomicilecode = 'LOP') THEN 8840
           WHEN (type = 'PROC2'
               AND contractdomicilecode = 'AWE') THEN 1490
           WHEN (type = 'PROC3'
               AND contractdomicilecode = 'MNH') THEN 1600
           WHEN (type = 'PROC3'
               AND contractdomicilecode = 'LKP') THEN 1900
           END AS amount,
       pa.total
FROM xyz.orders pa
         JOIN
     (select xo.clientid    AS clientid,
             xo.version     AS version,
             ai.week_number as week_number from (SELECT DISTINCT entity_id, week_number
       FROM abc.items
       WHERE week_number >= Extract(week FROM CURRENT_DATE) - 6
         AND week_number <= Extract(week FROM CURRENT_DATE) - 1
         AND item_type LIKE '%Ionize - Data%')
         ai LEFT JOIN
         (SELECT clientid     AS clientid,
                 Max(version) AS version,
                 consumerid
          FROM xyz.orders
          WHERE createdfor = 'BLOCK'
            AND holder = 'RELAY_FUTURES'
          GROUP BY consumerid, clientid) xo
      ON ai.entity_id = xo.consumerid) pb
     ON pa.clientid = pb.clientid
         AND pa.version = pb.version;

要获取过去6周的所有不同实体id、周号组合。表1

SELECT DISTINCT entity_id, week_number
       FROM abc.items
       WHERE week_number >= Extract(week FROM CURRENT_DATE) - 6
         AND week_number <= Extract(week FROM CURRENT_DATE) - 1
         AND item_type LIKE '%Ionize - Data%'
连接以上两个表以获取clientId、version和Week Number

select xo.clientid    AS clientid,
             xo.version     AS version,
             ai.week_number as week_number from (SELECT DISTINCT entity_id, week_number
       FROM abc.items
       WHERE week_number >= Extract(week FROM CURRENT_DATE) - 6
         AND week_number <= Extract(week FROM CURRENT_DATE) - 1
         AND item_type LIKE '%Ionize - Data%')
         ai LEFT JOIN
         (SELECT clientid     AS clientid,
                 Max(version) AS version,
                 consumerid
          FROM xyz.orders
          WHERE createdfor = 'BLOCK'
            AND holder = 'RELAY_FUTURES'
          GROUP BY consumerid, clientid) xo
      ON ai.entity_id = xo.consumerid
Left join用于放弃表1中不存在的所有使用者id

将上述查询用作内部查询

SELECT pb.week_number,
       pa.type,
       CASE
           WHEN (type = 'PROC1'
               AND contractdomicilecode = 'UIT') THEN 450
           WHEN (type = 'PROC1'
               AND contractdomicilecode = 'KJH') THEN 900
           WHEN (type = 'PROC2'
               AND contractdomicilecode = 'LOP') THEN 8840
           WHEN (type = 'PROC2'
               AND contractdomicilecode = 'AWE') THEN 1490
           WHEN (type = 'PROC3'
               AND contractdomicilecode = 'MNH') THEN 1600
           WHEN (type = 'PROC3'
               AND contractdomicilecode = 'LKP') THEN 1900
           END AS amount,
       pa.total
FROM xyz.orders pa
         JOIN
     (select xo.clientid    AS clientid,
             xo.version     AS version,
             ai.week_number as week_number from (SELECT DISTINCT entity_id, week_number
       FROM abc.items
       WHERE week_number >= Extract(week FROM CURRENT_DATE) - 6
         AND week_number <= Extract(week FROM CURRENT_DATE) - 1
         AND item_type LIKE '%Ionize - Data%')
         ai LEFT JOIN
         (SELECT clientid     AS clientid,
                 Max(version) AS version,
                 consumerid
          FROM xyz.orders
          WHERE createdfor = 'BLOCK'
            AND holder = 'RELAY_FUTURES'
          GROUP BY consumerid, clientid) xo
      ON ai.entity_id = xo.consumerid) pb
     ON pa.clientid = pb.clientid
         AND pa.version = pb.version;

这回答了你的问题吗?不幸的是,事实并非如此,我通过更改内部子查询走了不同的路线,但我在这里遇到了一个错误。请删除子查询中的order by。您无法在子查询中执行Order By。我尝试删除Order By,但仍然存在相同的错误-操作无效:子查询的@saiabiraminapalain列太多在原始查询中使用week\u number>=extractweek from current\u date-6时会发生什么。它有效吗?这能回答你的问题吗?不幸的是,事实并非如此,我通过更改内部子查询走了不同的路线,但我在这里遇到了一个错误。请删除子查询中的order by。您无法在子查询中执行Order By。我尝试删除Order By,但仍然出现相同的错误-操作无效:子查询在原始q中有太多@saiabiraminapalain列

询问使用week\u number>=extractweek from current\u date-6时会发生什么情况。它能工作吗?谢谢Bill,但这能帮助我完成查询所需的输出吗?正如您在上面看到的,我已经预期了输出,我还需要做些什么才能获得这种格式?我需要每周的数据组。更改后,我可以很好地运行我的查询,但我对如何按周获取最终输出组感到困惑。此外,多周的条件将失败,因为当前是1月,当前周为2,所以它将为负值,对吗?我们有没有办法使用week_number列来纠正过去6周的错误?Andy,如果没有一些源数据样本输入数据和这些数据的预期输出,我们将很难理解这个查询是如何工作的。我看到的一个问题是,当周数在新年结束时,从当前_日期开始的一周-6不会像您预期的那样起作用。正如我提到的,我确实在为人们提供红移工作方面进行了咨询。发布的答案解决了这个主题的问题-如果需要一般的查询工作,我建议引进所需的人才。谢谢比尔。让我更深入地探讨这个问题,看看我是否能解决它。谢谢你的帮助!谢谢Bill,但这能帮我查询所需的输出吗?正如您在上面看到的,我已经预期了输出,我还需要做些什么才能获得这种格式?我需要每周的数据组。更改后,我可以很好地运行我的查询,但我对如何按周获取最终输出组感到困惑。此外,多周的条件将失败,因为当前是1月,当前周为2,所以它将为负值,对吗?我们有没有办法使用week_number列来纠正过去6周的错误?Andy,如果没有一些源数据样本输入数据和这些数据的预期输出,我们将很难理解这个查询是如何工作的。我看到的一个问题是,当周数在新年结束时,从当前_日期开始的一周-6不会像您预期的那样起作用。正如我提到的,我确实在为人们提供红移工作方面进行了咨询。发布的答案解决了这个主题的问题-如果需要一般的查询工作,我建议引进所需的人才。谢谢比尔。让我更深入地探讨这个问题,看看我是否能解决它。谢谢你的帮助!我尝试了您的建议,但它给了我语法错误,因为week_number列仅在abc.items中可用,但在xyz.orders中不可用,因此它抱怨操作无效:o.week_number列不存在;。另外,如果你看一下我在顶部问题中的第一个查询,它只在前一周的一周有效,因此它生成的输出只针对最后一周。现在我只需要以这种方式修改内部查询,这样我就可以获得过去6周的数据,但每周分组。这意味着我希望看到一个视图,其中week_number列从最内部的查询显示到顶部,以及该周的所有数据,就像我在问题中的第一个查询中显示的一样。将O.week_number替换为MaxVersions.week_number,removed and MaxVersions.WeekNumber=O.week\u number是否也需要在group by子句中将此O.week\u编号更改得太正确?没错。现在已更新。我尝试了您的建议,但它给了我语法错误,因为week_number列仅在abc.items中可用,但在xyz.orders中不可用,因此它抱怨操作无效:o.week_number列不存在;。另外,如果你看一下我在顶部问题中的第一个查询,它只在前一周的一周有效,因此它生成的输出只针对最后一周。现在我只需要以这种方式修改内部查询,这样我就可以获得过去6周的数据,但每周分组。这意味着我希望看到一个视图,其中week_number列从最内部的查询显示到顶部,以及该周的所有数据,就像我在问题中的第一个查询中显示的一样。将O.week_number替换为MaxVersions.week_number,removed and MaxVersions.WeekNumber=O.week\u number是否也需要在group by子句中将此O.week\u编号更改得太正确?没错。现在更新。