SPARK SQL按选择结果从组中选择

SPARK SQL按选择结果从组中选择,sql,select,nested,apache-spark-sql,Sql,Select,Nested,Apache Spark Sql,我有一张桌子,叫做新桌子。 在第一步中,我想按id、kmstand、vacationname和vacationvalue对结果进行分组,其中每个分组依据只存在一个计数。对于此步骤,我已经创建了一个查询: SELECT id, kmstand, vacationame, vacationvalue FROM `db_1`.`table_new` WHERE (vacationame='vacation1' OR vacationame='vacation2' OR va

我有一张桌子,叫做新桌子。 在第一步中,我想按id、kmstand、vacationname和vacationvalue对结果进行分组,其中每个分组依据只存在一个计数。对于此步骤,我已经创建了一个查询:

SELECT id, kmstand, vacationame, vacationvalue 
 FROM `db_1`.`table_new` 
 WHERE (vacationame='vacation1' 
    OR vacationame='vacation2' 
    OR vacationame='vacation3' 
    OR vacationame='vacation4') 
 GROUP BY id, kmstand, vacationame, vacationvalue 
 HAVING COUNT(*) = 1 ORDER BY id, kmstand DESC
结果是:

    id  kmstand vacationame vacationvalue
1   1   4000    vacation1   munich
2   1   4000    vacation1   stuttgart
3   1   5500    vacation4   koln
4   1   5500    vacation2   frankfurt
5   1   5500    vacation3   berlin
6   1   5500    vacation1   potsdam
7   2   6000    vacation2   new york
8   2   6000    vacation1   bangladesh
9   2   3000    vacation1   washington
10  2   3000    vacation3   chicago
现在,我想选择一个id,其中kmstand和vacationname的组合现在是不同的。这意味着结果应该是:

        id  kmstand vacationame vacationvalue
1   1   5500    vacation4   koln
2   1   5500    vacation2   frankfurt
3   1   5500    vacation3   berlin
4   1   5500    vacation1   potsdam
5   2   6000    vacation2   new york
6   2   6000    vacation1   bangladesh
7   2   3000    vacation1   washington
8   2   3000    vacation3   chicago
为此,我创建了以下嵌套sql查询:

    SELECT id, kmstand, count(*) as cnt 
FROM `db_1`.`table_new`
WHERE (SELECT id, kmstand, vacationame, vacationvalue 
     FROM `db_1`.`table_new` 
     WHERE (vacationame='vacation1' 
        OR vacationame='vacation2' 
        OR vacationame='vacation3' 
        OR vacationame='vacation4') 
     GROUP BY id, kmstand, vacationame, vacationvalue 
     HAVING COUNT(*) = 1 ORDER BY id, kmstand DESC) 
GROUP BY id, kmstand 
HAVING cnt = 1 
ORDER BY id, kmstand DESC
我也试过了,没有where子句或from,也没有找到解决方案。对于此SQL查询,我收到以下错误消息:
org.apache.spark.SQL.AnalysisException:无法识别表达式规范中“SELECT”“id”“附近的输入;第3行第7位置

我很确定,语法不对。您有什么建议吗?

不熟悉SPARK,但您可能想要:

SELECT id, kmstand, count(*) as cnt 
FROM (SELECT id, kmstand, vacationame, vacationvalue 
     FROM `db_1`.`table_new` 
     WHERE (vacationame='vacation1' 
        OR vacationame='vacation2' 
        OR vacationame='vacation3' 
        OR vacationame='vacation4') 
     GROUP BY id, kmstand, vacationame, vacationvalue 
     HAVING COUNT(*) = 1) T
GROUP BY id, kmstand 
HAVING cnt = 1 
ORDER BY id, kmstand DESC
注意,我在FROM子句中为表添加了一个别名(
T
)。这可能是必需的,也可能不是必需的,这取决于您的RDBMS


还请注意,您通常不能在子查询中按顺序排序。

这是问题的答案。现在我可以在组合id、kmstand和VacationName不同的地方获得id

SELECT id, sumcnt, cnt2
    FROM(
        SELECT id, count(*) as cnt2, sum(cnt) as sumcnt
        FROM (
            SELECT id, kmstand, vacationame, count(*) as cnt
            FROM `db_1`.`table_new` 
            WHERE (vacationame='vacation1'
                OR vacationame='vacation2'
                OR vacationame='vacation3'
                OR vacationame='vacation4')
            GROUP BY id, kmstand, vacationame)T
        GROUP BY id)T
    WHERE (sumcnt/cnt2 = 1)

您的查询存在的问题是,如果每个id的VacationName出现不止一次,则无法筛选出结果。结果应该是,只有具有非重复VacationName的id可用。我认为我们可以使用类似这样的内容:其中id的所有cnt都是1