2017-01-23 45 views
-2

我在C#中基于传入的参数动态构建一个查询。它基于我传递的内容正确构建查询,但我无法弄清楚为什么查询一直抛出Unexpected SELECT错误。该错误指的是该查询中的最后一个选择,紧跟在组和顺序之后。SQL意外的选择

这里是我的程序输出查询:

with allTables as (
    SELECT 
     UNIX_SECONDS(TIMESTAMP(DATE)) as date, 
     SUM(CASE WHEN period = 7 THEN users END) AS days_07 
    FROM (
     SELECT 
      activity.date AS DATE, 
      periods.period AS period, 
      COUNT(DISTINCT user) AS users             
     FROM ( 
      SELECT 
       activity.date AS DATE, 
       periods.period AS period, 
       COUNT(DISTINCT user) AS users 
      FROM ( 
       SELECT 
        DISTINCT DATE(TIMESTAMP_MICROS(event.timestamp_micros)) AS DATE, 
        user_dim.app_info.app_instance_id AS user 
       FROM `hidden.*` 
       CROSS JOIN 
        UNNEST(event_dim) AS event 
      ) AS activity 
      CROSS JOIN ( 
       SELECT 
        DATE(TIMESTAMP_MICROS(event.timestamp_micros)) AS DATE 
       FROM `hidden.*` 
       CROSS JOIN 
        UNNEST(event_dim) AS event 
       GROUP BY event.timestamp_micros 
      ) AS dates 
      CROSS JOIN ( 
       SELECT period FROM (SELECT 7 AS period) 
      ) AS periods 
      WHERE 
       dates.date >= activity.date 
      AND 
       SAFE_CAST(FLOOR(DATE_DIFF(dates.date, activity.date, DAY)/periods.period) AS INT64) = 0 
      GROUP BY 1,2 
     ) GROUP BY DATE ORDER BY DATE 
    ) SELECT 'all apps' as target, date as datapoint_time, days_07 as datapoint_value FROM allTables 
+0

可你为什么不只是粘贴查询到Web UI,让BigQuery的查询语法吗? –

回答

3

你缺少一个更右括号正确选择之前
应该

WITH allTables AS (
    SELECT 
     UNIX_SECONDS(TIMESTAMP(DATE)) AS DATE, 
     SUM(CASE WHEN period = 7 THEN users END) AS days_07 
    FROM (
     SELECT 
      activity.date AS DATE, 
      periods.period AS period, 
      COUNT(DISTINCT user) AS users             
     FROM ( 
      SELECT 
       activity.date AS DATE, 
       periods.period AS period, 
       COUNT(DISTINCT user) AS users 
      FROM ( 
       SELECT 
        DISTINCT DATE(TIMESTAMP_MICROS(event.timestamp_micros)) AS DATE, 
        user_dim.app_info.app_instance_id AS user 
       FROM `hidden.*` 
       CROSS JOIN 
        UNNEST(event_dim) AS event 
      ) AS activity 
      CROSS JOIN ( 
       SELECT 
        DATE(TIMESTAMP_MICROS(event.timestamp_micros)) AS DATE 
       FROM `hidden.*` 
       CROSS JOIN 
        UNNEST(event_dim) AS event 
       GROUP BY event.timestamp_micros 
      ) AS dates 
      CROSS JOIN ( 
       SELECT period FROM (SELECT 7 AS period) 
      ) AS periods 
      WHERE 
       dates.date >= activity.date 
      AND 
       SAFE_CAST(FLOOR(DATE_DIFF(dates.date, activity.date, DAY)/periods.period) AS INT64) = 0 
      GROUP BY 1,2 
     ) GROUP BY DATE ORDER BY DATE 
    ) 
) SELECT 'all apps' AS target, DATE AS datapoint_time, days_07 AS datapoint_value FROM allTables 

想分享的超级简单的方法处理此类“问题”
1.将故障查询复制到查询编辑器
2.确保正确的SQL版本为挑选(可选但更好)
3.现在您可以使用代码折叠功能。您可以折叠(折叠)代码片段,将它们缩小为单个可见行。通过这种方式,您可以隐藏目前看起来不重要的细节。如果并且在必要时,折叠的代码片段可以被展开(展开)。虽然折叠 - 你可以观察你的代码留下的实现细节放在一边,专注于结构等。此外,它可以帮助你的情况确定蝽象
enter image description here
4.匹配编辑器的功能,那么你可以使用括号(如下)
enter image description here
清楚地看到,匹配托架丢失
enter image description here

顺便说一句,BigQuery的伴侣具有的功能,称为展大纲也可以在许多情况下帮助时,你有浓密的查询中想高水平的“图片”。这是伴侣面板,并通过上下文菜单

enter image description here

+0

现在它在[7:13]错误处抛出'Unrecognized name:activity'。 –

+1

@JoeScotto - 1)一次提出一个问题!看起来这个问题是回答! 2)在问下一个问题之前 - 真的 - 请尝试首先排查您的问题。抱歉说这个 - 但看起来你正在使用SO来外包你的工作。我们在这里帮助你,而不是做你的工作!不要个人承担 - 只要遵守SO –

+0

的规定,你在说什么,我没有降低任何东西。 –