sim*_*ley 2 sql greatest-n-per-group google-bigquery
我在BigQuery中存储了超过5亿行,它基本上代表了某个时间(不规则)设备的确切位置.
我正在尝试找到一种快速有效的方法来确定设备的第一个和最后一个看到的位置.
到目前为止,我已经使用了一个连接,但它需要花费10多分钟才能完成(除非我只是查询中的限制).我也试过一个dense_rank查询,但我无法对计数进行排序(我不完全理解它).
我有一个client_id,device_id(它是固定的,代表建筑物内的位置)和时间戳.
首先,我通过client_id和device_id做了一个组,以验证我应该期待什么.然后我尝试使用最小和最大时间戳加入表:
SELECT count(FirstSet.device_id), FirstSet.device_id
FROM
(
SELECT client_id, device_id, created_at
FROM [mytable.visitsv3]
WHERE secret = 'xxx'
GROUP each BY client_id, device_id, created_at
ORDER BY client_id, created_at asc
LIMIT 1000
) as FirstSet
inner join
(
SELECT client_id, device_id, min(created_at)
FROM [mytable.visitsv3]
WHERE secret = 'xxx'
GROUP each BY client_id, device_id, created_at
LIMIT 1000
) SecondSet
on FirstSet.device_id = SecondSet.device_id
GROUP BY FirstSet.device_id
ORDER BY 1 DESC
limit 25
Run Code Online (Sandbox Code Playgroud)
我是这个世界的新手,所以会很感激一些建议.正如我所说,它更多是关于性能,因为我们需要实时运行查询.
有大量关于同一概念的教程 - 我只是希望有人可以帮助优化事物.
---编辑---
输出格式应如下所示:
|count|device_id|
-----------------
|10000| 123|
| 9000| 345|
| 800| 234|
Run Code Online (Sandbox Code Playgroud)
- - 在上下文中 - -
我们正在尝试使用我们的数据集实现许多功能(当然不是在单个查询中).包含:
最初这只需要总计但是长期,我们必须了解哪些入口/出口点在一天的特定时间都很忙.然后使用相关函数进行一些预测分析.
一旦我们有了入口点,我们就需要映射客户端所采用的路径.同样,我们需要预测每天/每小时的行为等.
最初,我们只需要最受欢迎的进入/退出点.出于这个原因,我们将客户端分组在一起并对其出现的设备进行了计数.
数据如下所示:
client_id,device_id,created_at,start,end,duration,lat,lng
F047CA72E,0013BA30,2015-06-22 10:00:32 UTC,2015-06-22 09:30:31 UTC,2015-06-22 09:30:32 UTC,1,XX,YY
F40D8632F,00A30E00,2015-06-22 10:00:29 UTC,2015-06-22 09:30:26 UTC,2015-06-22 09:30:26 UTC,0,XX,YY
B808AA3E0,00138B20,2015-06-22 10:00:27 UTC,2015-06-22 09:30:25 UTC,2015-06-22 09:30:25 UTC,0,XX,YY
A0E532E96,00A33600,2015-06-22 10:00:34 UTC,2015-06-22 09:30:24 UTC,2015-06-22 09:30:25 UTC,1,XX,YY
D4F6F8D50,00149150,2015-06-22 10:00:34 UTC,2015-06-22 09:30:22 UTC,2015-06-22 09:30:22 UTC,0,XX,YY
70124EB7E,00A350A0,2015-06-22 10:00:33 UTC,2015-06-22 09:30:14 UTC,2015-06-22 09:30:14 UTC,0,XX,YY
200AF2A9E,00149090,2015-06-22 10:00:33 UTC,2015-06-22 09:30:13 UTC,2015-06-22 09:30:12 UTC,0,XX,YY
20AE4884A,0013EFC0,2015-06-22 10:00:30 UTC,2015-06-22 09:30:13 UTC,2015-06-22 09:30:13 UTC,0,XX,YY
CCD9BB01C,0013EFC0,2015-06-22 10:00:30 UTC,2015-06-22 09:30:12 UTC,2015-06-22 09:30:06 UTC,0,XX,YY
8CCE1F24E,0004165E,2015-06-22 10:00:12 UTC,2015-06-22 09:30:12 UTC,2015-06-22 09:30:12 UTC,0,XX,YY
Run Code Online (Sandbox Code Playgroud)
每个设备的客户端数量在某种程度上是无关紧要的,因为无论如何,它都将针对热图进行标准化.我们只需要它们排名,以便我们可以看到最受欢迎和最不受欢迎.
让我重新说明我对设置的理解: - 设备安装在整个建筑物的固定位置 - 客户(人)在通过设备附近时移动通过建筑物,此事件被记录 - 客户端与client_id通过设备的时间device_id记录在时间戳created_at中
因此,给定客户端的第一个created_at时间戳是她进入建筑物时,相应的device_id将是一个入口点.要找到它,我们可以使用
select
client_id,
first_value(device_id)
over(partition by client_id order by created_at asc)
as entry_device_id
Run Code Online (Sandbox Code Playgroud)
为了找到10个最受欢迎的条目,我们可以使用TOP和COUNT(*),即
select top(entry_device_id, 10), count(*)
Run Code Online (Sandbox Code Playgroud)
把它们放在一起:
select top(entry_device_id, 10), count(*) from (
select
client_id,
first_value(device_id)
over(partition by client_id order by created_at asc)
as entry_device_id
from [mytable.visitsv3]
)
Run Code Online (Sandbox Code Playgroud)
退出点也一样,但这次我们将使用last_value窗口函数:
select top(exit_device_id, 10), count(*) from (
select
client_id,
last_value(device_id)
over(partition by client_id order by created_at asc)
as exit_device_id
from [mytable.visitsv3]
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5093 次 |
| 最近记录: |