Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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
Google bigquery 时间段分组依据之间的BigQuery计数实例_Google Bigquery - Fatal编程技术网

Google bigquery 时间段分组依据之间的BigQuery计数实例

Google bigquery 时间段分组依据之间的BigQuery计数实例,google-bigquery,Google Bigquery,我有一个上传到BigQuery的订单表,其中包含以下标题 SELECT ConsumerID, CountOfOrdersTwelve FROM ( SELECT ConsumerID, TIMESTAMP_TO_SEC(TIMESTAMP(TransactionDate)) AS ts, COUNT(ts) OVER (PARTITION BY ConsumerID ORDER BY ts RANGE BETWEEN CURRENT ROW A

我有一个上传到BigQuery的订单表,其中包含以下标题

SELECT 
  ConsumerID, CountOfOrdersTwelve
FROM (
  SELECT 
    ConsumerID,
    TIMESTAMP_TO_SEC(TIMESTAMP(TransactionDate)) AS ts,
    COUNT(ts) OVER (PARTITION BY ConsumerID ORDER BY ts 
      RANGE BETWEEN CURRENT ROW AND 365*24*3600 FOLLOWING) AS CountOfOrdersTwelve,
    ROW_NUMBER() OVER(PARTITION BY ConsumerID ORDER BY ts) AS pos
  FROM [ordertable.orders]
)
WHERE pos = 1
ORDER BY ConsumerID
ConsumerID、TransactionDate、Revenue、OrderID

SELECT 
  ConsumerID, CountOfOrdersTwelve
FROM (
  SELECT 
    ConsumerID,
    TIMESTAMP_TO_SEC(TIMESTAMP(TransactionDate)) AS ts,
    COUNT(ts) OVER (PARTITION BY ConsumerID ORDER BY ts 
      RANGE BETWEEN CURRENT ROW AND 365*24*3600 FOLLOWING) AS CountOfOrdersTwelve,
    ROW_NUMBER() OVER(PARTITION BY ConsumerID ORDER BY ts) AS pos
  FROM [ordertable.orders]
)
WHERE pos = 1
ORDER BY ConsumerID
ConsumerID和OrderID是整数 TransactionDate是一个时间戳

SELECT 
  ConsumerID, CountOfOrdersTwelve
FROM (
  SELECT 
    ConsumerID,
    TIMESTAMP_TO_SEC(TIMESTAMP(TransactionDate)) AS ts,
    COUNT(ts) OVER (PARTITION BY ConsumerID ORDER BY ts 
      RANGE BETWEEN CURRENT ROW AND 365*24*3600 FOLLOWING) AS CountOfOrdersTwelve,
    ROW_NUMBER() OVER(PARTITION BY ConsumerID ORDER BY ts) AS pos
  FROM [ordertable.orders]
)
WHERE pos = 1
ORDER BY ConsumerID
数据结构如下所示

ConsumerId   || TransactionDate          || Revenue   ||  OrderID
1            || 2014-10-27 00:00:00 UTC  || 55        ||  653745
1            || 2015-02-27 00:00:00 UTC  || 65        ||  767833
1            || 2015-12-27 00:00:00 UTC  || 456       ||  5676324
2            || 2014-10-27 00:00:00 UTC  || 56        ||  435261
2            || 2016-02-27 00:00:00 UTC  || 43        ||  5632436724
SELECT 
  ConsumerID, CountOfOrdersTwelve
FROM (
  SELECT 
    ConsumerID,
    TIMESTAMP_TO_SEC(TIMESTAMP(TransactionDate)) AS ts,
    COUNT(ts) OVER (PARTITION BY ConsumerID ORDER BY ts 
      RANGE BETWEEN CURRENT ROW AND 365*24*3600 FOLLOWING) AS CountOfOrdersTwelve,
    ROW_NUMBER() OVER(PARTITION BY ConsumerID ORDER BY ts) AS pos
  FROM [ordertable.orders]
)
WHERE pos = 1
ORDER BY ConsumerID
所以我的预期输出是

ConsumerId   || Count Of Orders In Last 12 months
    1        || 2
    2        || 1
SELECT 
  ConsumerID, CountOfOrdersTwelve
FROM (
  SELECT 
    ConsumerID,
    TIMESTAMP_TO_SEC(TIMESTAMP(TransactionDate)) AS ts,
    COUNT(ts) OVER (PARTITION BY ConsumerID ORDER BY ts 
      RANGE BETWEEN CURRENT ROW AND 365*24*3600 FOLLOWING) AS CountOfOrdersTwelve,
    ROW_NUMBER() OVER(PARTITION BY ConsumerID ORDER BY ts) AS pos
  FROM [ordertable.orders]
)
WHERE pos = 1
ORDER BY ConsumerID
我想统计客户自第一次订购之日起12个月内的订单数量

SELECT 
  ConsumerID, CountOfOrdersTwelve
FROM (
  SELECT 
    ConsumerID,
    TIMESTAMP_TO_SEC(TIMESTAMP(TransactionDate)) AS ts,
    COUNT(ts) OVER (PARTITION BY ConsumerID ORDER BY ts 
      RANGE BETWEEN CURRENT ROW AND 365*24*3600 FOLLOWING) AS CountOfOrdersTwelve,
    ROW_NUMBER() OVER(PARTITION BY ConsumerID ORDER BY ts) AS pos
  FROM [ordertable.orders]
)
WHERE pos = 1
ORDER BY ConsumerID
在大查询中,我写了以下内容

SELECT
  ConsumerId,
  COUNT(OrderNumber BETWEEN MIN(TransactionDate)AND DATE_ADD(MIN(TransactionDate),11,"MONTH")) AS CountOfOrdersTwelve,
FROM
  [ordertable.orders]
GROUP BY
  1,
  2
ORDER BY
  ConsumerId ;
SELECT 
  ConsumerID, CountOfOrdersTwelve
FROM (
  SELECT 
    ConsumerID,
    TIMESTAMP_TO_SEC(TIMESTAMP(TransactionDate)) AS ts,
    COUNT(ts) OVER (PARTITION BY ConsumerID ORDER BY ts 
      RANGE BETWEEN CURRENT ROW AND 365*24*3600 FOLLOWING) AS CountOfOrdersTwelve,
    ROW_NUMBER() OVER(PARTITION BY ConsumerID ORDER BY ts) AS pos
  FROM [ordertable.orders]
)
WHERE pos = 1
ORDER BY ConsumerID
但是,这会导致以下错误

SELECT
  ConsumerId,
  COUNT(OrderNumber BETWEEN MIN(TransactionDate)AND DATE_ADD(MIN(TransactionDate),11,"MONTH")) AS CountOfOrdersTwelve,
FROM
  [ordertable.orders]
GROUP BY
  1,
  2
ORDER BY
  ConsumerId ;
SELECT 
  ConsumerID, CountOfOrdersTwelve
FROM (
  SELECT 
    ConsumerID,
    TIMESTAMP_TO_SEC(TIMESTAMP(TransactionDate)) AS ts,
    COUNT(ts) OVER (PARTITION BY ConsumerID ORDER BY ts 
      RANGE BETWEEN CURRENT ROW AND 365*24*3600 FOLLOWING) AS CountOfOrdersTwelve,
    ROW_NUMBER() OVER(PARTITION BY ConsumerID ORDER BY ts) AS pos
  FROM [ordertable.orders]
)
WHERE pos = 1
ORDER BY ConsumerID
错误:(L3:157):无法按聚合进行分组

SELECT 
  ConsumerID, CountOfOrdersTwelve
FROM (
  SELECT 
    ConsumerID,
    TIMESTAMP_TO_SEC(TIMESTAMP(TransactionDate)) AS ts,
    COUNT(ts) OVER (PARTITION BY ConsumerID ORDER BY ts 
      RANGE BETWEEN CURRENT ROW AND 365*24*3600 FOLLOWING) AS CountOfOrdersTwelve,
    ROW_NUMBER() OVER(PARTITION BY ConsumerID ORDER BY ts) AS pos
  FROM [ordertable.orders]
)
WHERE pos = 1
ORDER BY ConsumerID

有人知道在BigQu疑问中能做到这一点吗?< /P> < P>快速选项,供您考虑(假设输入如下)

SELECT 
  ConsumerID, CountOfOrdersTwelve
FROM (
  SELECT 
    ConsumerID,
    TIMESTAMP_TO_SEC(TIMESTAMP(TransactionDate)) AS ts,
    COUNT(ts) OVER (PARTITION BY ConsumerID ORDER BY ts 
      RANGE BETWEEN CURRENT ROW AND 365*24*3600 FOLLOWING) AS CountOfOrdersTwelve,
    ROW_NUMBER() OVER(PARTITION BY ConsumerID ORDER BY ts) AS pos
  FROM [ordertable.orders]
)
WHERE pos = 1
ORDER BY ConsumerID
您的数据可能因数据类型而异,因此需要进行相应调整

SELECT ConsumerID, MAX(CountOfOrders) AS CountOfOrdersTwelve
FROM (
  SELECT ConsumerID, CountOfOrders
  FROM (
    SELECT
      ConsumerID, TransactionDate,
      COUNT(1) OVER(PARTITION BY ConsumerID ORDER BY TransactionDate) AS CountOfOrders,
      FIRST_VALUE(TransactionDate) 
        OVER(PARTITION BY ConsumerID ORDER BY TransactionDate) AS firstTransactionDate
    FROM [ordertable.orders]
  ) HAVING DATEDIFF(TransactionDate, firstTransactionDate) <= 365
) GROUP BY ConsumerID ORDER BY ConsumerID
SELECT 
  ConsumerID, CountOfOrdersTwelve
FROM (
  SELECT 
    ConsumerID,
    TIMESTAMP_TO_SEC(TIMESTAMP(TransactionDate)) AS ts,
    COUNT(ts) OVER (PARTITION BY ConsumerID ORDER BY ts 
      RANGE BETWEEN CURRENT ROW AND 365*24*3600 FOLLOWING) AS CountOfOrdersTwelve,
    ROW_NUMBER() OVER(PARTITION BY ConsumerID ORDER BY ts) AS pos
  FROM [ordertable.orders]
)
WHERE pos = 1
ORDER BY ConsumerID

感谢您的回复,查询运行时没有错误,不幸的是它返回0个结果,这不可能是真的,因为人们显然必须下订单。数据类型重要吗?ConsumerId和OrderNumber是整数,我是否应该澄清OrderNumber只是一个数据库增量数字,而不是说明客户的订单数量。我真的非常感谢您能提供的任何帮助。以上查询确实有效-问题可能是您特定数据中的数据类型。请提供您的数据的简要示例,我将分别进行调整谢谢,为原始问题添加了澄清非常感谢,精简版非常完美…而且速度非常快。非常感谢你的帮助。