Google bigquery 时间段分组依据之间的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
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只是一个数据库增量数字,而不是说明客户的订单数量。我真的非常感谢您能提供的任何帮助。以上查询确实有效-问题可能是您特定数据中的数据类型。请提供您的数据的简要示例,我将分别进行调整谢谢,为原始问题添加了澄清非常感谢,精简版非常完美…而且速度非常快。非常感谢你的帮助。