Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
在MySQL中混合使用CASE或解析函数(partitionquality(?)?_Mysql_Having_Window Functions - Fatal编程技术网

在MySQL中混合使用CASE或解析函数(partitionquality(?)?

在MySQL中混合使用CASE或解析函数(partitionquality(?)?,mysql,having,window-functions,Mysql,Having,Window Functions,我有一个SELECT查询,返回如下字段: Date | Campaign_Name | Type | Count_People Oct | Cats | 1 | 500 Oct | Cats | 2 | 50 Oct | Dogs | 1 | 80 Oct | Dogs | 2 | 50 SELECT full_data.date AS date, full_data.cam

我有一个SELECT查询,返回如下字段:

Date | Campaign_Name | Type | Count_People
Oct  | Cats          | 1    | 500
Oct  | Cats          | 2    | 50
Oct  | Dogs          | 1    | 80
Oct  | Dogs          | 2    | 50
SELECT
    full_data.date AS date,
    full_data.campaign_name AS campaign_name,
    full_data.type AS type,
    COUNT(full_data.people) AS people_count
FROM
    (
        SELECT
            date,
            campaign_name,
            type,
            COUNT(people) AS people_count
        FROM table
        WHERE type IN (1,2)
        GROUP BY date, campaign_name, type
    ) AS full_data   
LEFT JOIN
    (
        SELECT
            date,
            campaign_name,
            COUNT(people) AS people_count
        FROM table
        WHERE type = 1
        GROUP BY date, campaign_name
        HAVING people_count < 100
    ) AS filter
ON
    full_data.date = filter.date
    AND full_data.campaign_name = filter.campaign_name
WHERE
    filter.date IS NULL
    AND filter.campaign_name IS NULL
查询使用聚合,我只想在Type=1时包含结果,然后确保相应的Count\u People大于99

使用示例表,我希望返回两行:Cats。如果Dogs是type 1,则排除它,因为它低于100,在这种情况下,Dogs=2也应排除

换句话说,如果type=1小于100,则删除相应活动名称的所有记录

我开始尝试这个:

HAVING CASE WHEN type = 1 THEN COUNT(DISTINCT Count_People) > 99 END
我在今年早些时候使用了Teradata,还记得我在一个使用分析函数Qualife PartitionBy的查询中工作过。我怀疑我需要的就是这些方面的东西?我需要在运行查询之前将排除建立在聚合的基础上


在MySQL中如何实现这一点?我说得通吗?

现在我理解了这个问题,我认为您最好的选择是使用子查询来确定类型为1的日期/活动组合的人数大于99人

SELECT
    <table>.date,
    <table>.campaign_name,
    <table>.type,
    count(distinct count_people) as count_people    
FROM
    (
        SELECT
            date,
            campaign_name           
        FROM
            <table>
        WHERE type=1
        HAVING count(distinct count_people) > 99
        GROUP BY 1,2
    ) type1
    LEFT OUTER JOIN <table> ON
        type1.campaign_name = <table>.campaign_name AND
        type1.date = <table>.date
WHERE <table>.type IN (1,2)
GROUP BY 1,2,3
此处的子查询仅在类型为1且人数大于99人时返回活动/日期组合。它使用左连接返回,以确保只有这些活动/日期组合才能进入结果集中


主查询上的WHERE仅将结果保留为类型1和类型2,您表示这已经是一个过滤器,尽管在问题中未提及,但在对以前答案的注释中已说明。

根据@jnevil对答案的注释,我想您别无选择,只能使用子选择来预筛选您正在使用的记录集处理,因为处理have将仅限于当前正在评估的记录-无法以这种方式与集合中以前或以后的记录进行比较

看看下面的例子:

Date | Campaign_Name | Type | Count_People
Oct  | Cats          | 1    | 500
Oct  | Cats          | 2    | 50
Oct  | Dogs          | 1    | 80
Oct  | Dogs          | 2    | 50
SELECT
    full_data.date AS date,
    full_data.campaign_name AS campaign_name,
    full_data.type AS type,
    COUNT(full_data.people) AS people_count
FROM
    (
        SELECT
            date,
            campaign_name,
            type,
            COUNT(people) AS people_count
        FROM table
        WHERE type IN (1,2)
        GROUP BY date, campaign_name, type
    ) AS full_data   
LEFT JOIN
    (
        SELECT
            date,
            campaign_name,
            COUNT(people) AS people_count
        FROM table
        WHERE type = 1
        GROUP BY date, campaign_name
        HAVING people_count < 100
    ) AS filter
ON
    full_data.date = filter.date
    AND full_data.campaign_name = filter.campaign_name
WHERE
    filter.date IS NULL
    AND filter.campaign_name IS NULL

第一个子选择基本上是您当前的查询,不需要任何过滤结果的尝试。第二个子选择用于查找所有人员计数>100的日期/活动名称组合,并将其用作完整数据集的过滤器。

MySQL没有窗口函数,即分析函数。因此您需要d寻找不同的解决方案Orry在键入时没有看到@JNevill的答案。这是相同的基本概念,只是语义稍有不同。我使用空过滤器而不是正过滤器。