【问题标题】:PRESTO (Athena) counting distinct cases, and adding rows as 1 string for string searchPRESTO (Athena) 计算不同的案例,并将行添加为 1 个字符串以进行字符串搜索
【发布时间】:2021-12-04 00:20:33
【问题描述】:

由于没有更好的词,我有这张表叫做“问卷”:

user_id | question          answer
--------------------------|-----------  
A       | can you sing?   |Yes
A       | can you dance?  |Yes
A       | did you eat?    |No
B       | can you sing?   |No
C       | can you sing?   |Yes
C       | did you eat?    |Yes

我想编写一个查询来显示下面的内容。我知道如何制作最后 3 列,但我需要帮助处理“可以唱歌和跳舞的案例”,比如有多少不同的人可以唱歌和跳舞。 所以我想要这样的输出:

DESIRED OUTPUT:

can sing & dance | can sing | can dance |total user_ids
-----------------|----------|-----------|---------------
 1               | 2        |1          |3

解决此问题的最佳方法是什么? 最初,我只使用 SUM(CASE(WHEN ....THEN 1 ELSE 0 END) 来表示“can sing”和“can dance”以及 COUNT(distinct user_id),但这对“can sing and dance'(来自所需输出的第 1 列)的情况,除非我做错了什么。

我的表格的结构与示例相同。用户可以回答他们想回答多少个问题(他们不必回答所有问题,他们可以回答尽可能多的问题)

答案只能是“是”或“否”

我在想,如果我能以某种方式编写一个子查询,让它看起来像这样:

user_id|question& answer
-------|---------
A      | can you sing?Yes,can you dance?Yes,did you eat?Yes
B      | can you sing?No
C      | can you sing?Yes,did you eat?Yes

然后使用一些正则表达式技巧来搜索“问题&答案”列来计数?

我要求最好的方法。最后,我想要 COUNTS,如果我能得到一个非常有用的提示:)(请 ^-^)

我使用的是 Amazon Athena,所以使用 PRESTO SQL

【问题讨论】:

    标签: sql amazon-athena presto


    【解决方案1】:

    不漂亮。

    内部选择为每个用户获取所有需要的数据。

    外部 SELECT 决定申请的用户数量

    SELECT
    SUM(IF(`can you sing?` = 1 AND `can you dance?` = 1,1,0)) AS 'can you sing and dance?',
    SUM(`can you sing?`) AS 'can you sing?',
    SUM(`can you dance?`) AS 'can you dance?',
    SUM(`did you eat?`) AS 'did you eat?',
    (SELECT COUNT(DISTINCT `user_id`) FROM questionnaire) AS 'total user_ids'
    FROM
    (SELECT
        SUM(       CASE
           WHEN `question` = 'can you sing?' AND  `answer` =  'Yes' THEN 1
            ELSE  0 END)) AS 'can you sing?',
        SUM(   CASE
           WHEN `q`question` = 'can you dance?' AND `answer` =  'Yes' THEN  1 ELSE 0 END)) AS 'can you dance?',
        SUM(   CASE
           WHEN `q`question` = 'did you eat?' AND `answer` =  'Yes' THEN 1 ELSE 0 END)) AS 'did you eat?'
    FROM
    questionnaire
    GROUP BY `user_id`) t1
    

    【讨论】:

      猜你喜欢
      • 2017-01-15
      • 1970-01-01
      • 2022-06-21
      • 2012-02-20
      • 2013-05-02
      • 1970-01-01
      • 2022-08-17
      • 2015-12-12
      • 1970-01-01
      相关资源
      最近更新 更多