输出在同一行的几种情况

时间:2017-11-14 17:01:17

标签: sql postgresql

我遇到了一个非常复杂的postgreSQL查询问题,我可以简要总结如下:

我有一群购买苹果,橙子或两者的顾客。我也知道每次购买的每个日期。我想要的是每个顾客和每个水果的首次购买日期。

为此,我使用以下查询:

SELECT distinct 
CASE WHEN fruitType = 'apple' then min(purchaseDate)
ELSE null END AS appleFirstPurchaseDate
, CASE WHEN fruitType = 'orange' then min(purchaseDate)
ELSE null END AS orangeFirstPurchaseDate
FROM fruitPurchases
GROUP BY fruitType

我也有这个版本(我不知道哪个更适合这个问题):

SELECT distinct 
CASE WHEN fruitType = 'apple' then min(purchaseDate) over(partition by fruitType) 
ELSE null END AS appleFirstPurchaseDate
, CASE WHEN fruitType = 'orange' then min(purchaseDate) over(partition by fruitType)
ELSE null END AS orangeFirstPurchaseDate
FROM fruitPurchases

两者都给出相同的结果,当顾客只购买橙子或只购买苹果时,它可以正常工作。然而,当他们已经购买两者时,我得到了同一个客户:

appleFirstPurchaseDate  orangeFirstPurchaseDate
----------------------  -----------------------
       2017-05-03                [NULL]
         [NULL]                2016-11-25

虽然我梦寐以求的结果是:

appleFirstPurchaseDate  orangeFirstPurchaseDate
----------------------  -----------------------
       2017-05-03              2016-11-25

我还检查了这个solution(3个选项中的第一个)建议使用MAX函数,但由于我的MIN函数,我收到此错误消息:“聚合函数调用无法嵌套”

我模糊地意识到子查询可以解决这个问题但是,鉴于我正在处理的整个代码混乱,我宁愿得到一个解决方案,它不会添加新的FROM子句,并且会继续使用CASE WHEN的。如果不可能,我会对任何解决方案感到满意:)

1 个答案:

答案 0 :(得分:2)

import pymysql
conn = MySQLdb.connect(host=dsn_hostname, port=dsn_port, user=dsn_uid, passwd=dsn_pwd, db=dsn_database)