Sql 获取过去X周的数据时,子查询的列太多错误?
我有下面的查询,它提供了我上周的数据,如下所示。它使用内部子查询中使用的week_number列返回具有以下列的数据:前一周的类型、金额和总计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
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编号更改得太正确?没错。现在更新。