在下面的代码中,我想选择customer_name、location、gender和address以及customerid、aread_code。
select
customerid, aread_code, GREATEST(MAX(productid), MAX(itemid))
from
CUSTOMER C
inner join
ORDER O ON c.custid = o.custid
where
c.custtype = 'EXECUTIVE'
group
customerid, by aread_code;
我尝试使用GREATEST
函数和OVER PARTITION
BY来显示所需的列。它抛出了一个错误。
请你帮我选择所需的栏目。
谢谢你。
2条答案
按热度按时间h5qlskok1#
免责声明:
当使用多个表时,请使用表名限定列。您还没有这样做,因此我们不知道
aread_code
驻留在两个表中的哪个表中。在我的回答中,我假设它是客户的区域。如果不是,则需要不同的回答。答复:
按customer_id和区号分组,这样每个客户占一行,并且需要orders表中的最大产品/项目ID(我认为它们是从同一序列中提取的,因此可以使用此ID继续进行)。
最简单的方法是在子查询中获取最大ID,可以直接在select子句中获取,也可以在from子句中获取。
下面是在
SELECT
子句中执行此操作的方法:下面是在
FROM
子句中执行此操作的一种方法:下面是在
FROM
子句中执行此操作的另一种方法:如果你只想要至少有一个订单的客户,那么我推荐使用
FROM
子句的方法,你必须把OUTER APPLY
转换成CROSS APPLY
,或者把LEFT OUTER JOIN
转换成INNER JOIN
。nxagd54h2#
您的代码中有几个错误。主要的混淆是没有为列使用表别名前缀。错误地使用了一个组,并且您的表名ORDER有问题-如果它是表的名称。ORDER是Oracle中的保留字,如果它是表的名称,则您应该使用类似“YOUR_OWNER_NAME”.“ORDER”...的内容。下面是带有一些示例数据和结果的更正代码:
根据您的实际数据,您可以使用部分或全部选项来获取其余列。
选项1 -按照Beefstu以下评论中的建议进行选择和分组
选项2. -将分析函数MAX()OVER()与Distinct关键字一起使用(对于大数据集,可能会导致性能成本过高)-结果与上面相同
选项3 -对子查询使用左连接-请参阅ThorstenKettner提供的解决方案