Google bigquery 将参数从2个select查询传递到另一个select查询

Google bigquery 将参数从2个select查询传递到另一个select查询,google-bigquery,Google Bigquery,我试图在select查询中比较同一列的两个不同值。 这是我的代码,我只传递一个值(来自最近的select查询)。您能帮助我如何从另一个查询传递第二个值吗? 为了更清楚一点,我想将endTime=null的startTime(我们的用户登录到我们的网站并且没有完成订单的时间)与endTime的startTime进行比较=null(用户登录并注册订单) 谢谢大家! 使用WITH子句,这种逻辑更容易在中表达(取消选中“显示选项”下的“使用遗留SQL”框)。要开始,您可能需要以下内容: WITH Com

我试图在select查询中比较同一列的两个不同值。 这是我的代码,我只传递一个值(来自最近的select查询)。您能帮助我如何从另一个查询传递第二个值吗? 为了更清楚一点,我想将endTime=null的startTime(我们的用户登录到我们的网站并且没有完成订单的时间)与endTime的startTime进行比较=null(用户登录并注册订单)


谢谢大家!

使用
WITH
子句,这种逻辑更容易在中表达(取消选中“显示选项”下的“使用遗留SQL”框)。要开始,您可能需要以下内容:

WITH CompletedOrders AS (
  SELECT
    startTime AS finished
  FROM
    datastore_dump.Orders
  WHERE
    emailAddress IN (
    SELECT
      emailAddress
    FROM
      datastore_dump.Orders
    WHERE
      endTime IS NULL)
    AND endTime IS NOT NULL and emailAddress IS NOT NULL
), IncompleteOrders AS (
  SELECT
    emailAddress,
    phone,
    __key__.id,
    startTime AS notFinished
  FROM
    datastore_dump.Orders
  WHERE
    endTime IS NULL)
SELECT ...
作为一个工作示例,您可以尝试:

WITH Orders AS (
  SELECT 'foo@example.com' AS email, CURRENT_TIMESTAMP() AS time
  UNION ALL SELECT 'bar@example.com' AS email, NULL AS time
  UNION ALL SELECT
    'baz@example.com',
    TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR) AS time),
CompletedOrders AS (
  SELECT * FROM Orders WHERE time IS NOT NULL),
IncompleteOrders AS (
  SELECT * FROM Orders WHERE time IS NULL)
SELECT
  (SELECT COUNT(*) FROM CompletedOrders) AS completed_count,
  (SELECT COUNT(*) FROM IncompleteOrders) AS incomplete_count;
+-----------------+------------------+
| completed_count | incomplete_count |
+-----------------+------------------+
|               2 |                1 |
+-----------------+------------------+

考虑以下逻辑:

SELECT
  emailAddress, startTime, endTime, DATEDIFF(endTime, startTime) AS daysDifference
FROM (
  SELECT
    emailAddress, startTime, endTime, status,
    LAG(status) OVER(PARTITION BY emailAddress ORDER BY startTime) AS prevStatus
  FROM (
    SELECT
      emailAddress, startTime, endTime,
      IF(endTime IS NULL, "not-finished", "finished") AS status
    FROM [datastore_dump.Orders]
  )
)
WHERE status = "finished"
AND prevStatus = "not-finished"
它的作用是:
1.根据
endTime

2.查找每个记录的以前状态-
prevStatus

3.对于状态为已完成和以前状态为未完成的记录-计算差异


希望这与您的提问接近

非常感谢,您的回答真的很有帮助。有一件事我还不明白,我怎么才能知道状态的开始时间=还没有完成?我想知道用户是在当天晚些时候还是几天后完成了购物。这就是为什么我想使用endTime为null的startTime和endTime为not null的startTime的日期差。在
中,如果(endTime为null,“not finished”,“finished”)作为状态
-状态设置为
not finished
如果endTime为null,则根据您在问题中的定义,我想我现在投票支持它。只到1,对吗?谢谢你的评论。谢谢你,这真的很有帮助!
SELECT
  emailAddress, startTime, endTime, DATEDIFF(endTime, startTime) AS daysDifference
FROM (
  SELECT
    emailAddress, startTime, endTime, status,
    LAG(status) OVER(PARTITION BY emailAddress ORDER BY startTime) AS prevStatus
  FROM (
    SELECT
      emailAddress, startTime, endTime,
      IF(endTime IS NULL, "not-finished", "finished") AS status
    FROM [datastore_dump.Orders]
  )
)
WHERE status = "finished"
AND prevStatus = "not-finished"