我遇到了一个非常复杂的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的。如果不可能,我会对任何解决方案感到满意:)
答案 0 :(得分:2)
import pymysql
conn = MySQLdb.connect(host=dsn_hostname, port=dsn_port, user=dsn_uid, passwd=dsn_pwd, db=dsn_database)