Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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
如何从另一个表的查询中获取值以创建新列(postgresql)_Sql_Postgresql_Case - Fatal编程技术网

如何从另一个表的查询中获取值以创建新列(postgresql)

如何从另一个表的查询中获取值以创建新列(postgresql),sql,postgresql,case,Sql,Postgresql,Case,我是postgres的新手,如果订单(订单表)是第一个月的订单(第一个月的订单表),我希望能够将值设置为Y 第一个月订单表如下所示。它将仅显示用户当月第一次下的订单: customer_id | order_date | order_id -------------------------------------------------- a1 | December 6, 2015, 8:30 PM | orderA1 订单表如下所示。它显示所有

我是postgres的新手,如果订单(订单表)是第一个月的订单(第一个月的订单表),我希望能够将值设置为Y

第一个月订单表如下所示。它将仅显示用户当月第一次下的订单:

customer_id | order_date                | order_id
--------------------------------------------------
a1          | December 6, 2015, 8:30 PM | orderA1
订单表如下所示。它显示所有订单记录:

customer_id | order_date                 | order_id
-----------------------------------------------------
a1          | December 6, 2020, 8:30 PM  | orderA1 
a1          | December 7, 2020, 8:30 PM  | orderA2 
a2          | December 11, 2020, 8:30 PM | orderA3 
为了获得order表中的第一个月order列,我尝试使用case,如下所示。但是,它会给出子查询返回的多行错误

SELECT DISTINCT ON (order_id) order_id, customer_id,
(CASE when (select distinct order_id from first_month_order_table) = order_id then 'Y' else 'N'
 END)
FROM order_table
ORDER BY order_id;
我也尝试过使用count,但后来我明白这是非常低效的,而且我认为数据库工作过度

SELECT DISTINCT ON (order_id) order_id, customer_id,
(CASE when (select count order_id from first_month_order_table) then 'Y' else 'N'
 END)
FROM order_table
ORDER BY order_id;

如何确定订单是否为第一个月的订单,并有效地将订单表中的每个订单的值设置为Y?

使用
左连接,如下所示:

SELECT o.order_id, o.customer_id,
       CASE when f.order_id is not null then 'Y' else 'N' END as flag
FROM order_table o left join first_month_order_table f
  on f.order_id = o.order_id 
ORDER BY o.order_id;

使用
左连接
,如下所示:

SELECT o.order_id, o.customer_id,
       CASE when f.order_id is not null then 'Y' else 'N' END as flag
FROM order_table o left join first_month_order_table f
  on f.order_id = o.order_id 
ORDER BY o.order_id;

如果
orders
表中有所有订单,则不需要第二个表。只需使用窗口函数。下面返回一个布尔值,我发现它比字符标志方便得多:

select o.*,
       (row_number() over (partition by customer_id, date_trunc('month', order_date order by order_date) = 1) as flag
from orders o;
如果需要字符标志,则需要
大小写

select o.*,
       (case when row_number() over (partition by customer_id, date_trunc('month', order_date order by order_date) = 1
             then 'Y' else 'N'
        end) as flag
from orders o;

如果
orders
表中有所有订单,则不需要第二个表。只需使用窗口函数。下面返回一个布尔值,我发现它比字符标志方便得多:

select o.*,
       (row_number() over (partition by customer_id, date_trunc('month', order_date order by order_date) = 1) as flag
from orders o;
如果需要字符标志,则需要
大小写

select o.*,
       (case when row_number() over (partition by customer_id, date_trunc('month', order_date order by order_date) = 1
             then 'Y' else 'N'
        end) as flag
from orders o;

这很有效。谢谢你帮我解决这个问题。谢谢你的帮助,这也行。谢谢你的帮助@厌倦了18岁。我提供这个答案是因为我认为这是一个简单得多的解决方案。这也有效。谢谢你的帮助@厌倦了18岁。我提供这个答案是因为我认为这是一个更简单的解决方案。