Sqlite SQL:分组以获得精确的行
假设有一个模式:Sqlite SQL:分组以获得精确的行,sqlite,Sqlite,假设有一个模式: |date|value| DBMS是SQLite 我想得到N个组,并计算每个组的平均值 样本: 2020-01-01 10:00|2.0 2020-01-01 11:00|2.0 2020-01-01 12:00|3.0 2020-01-01 13:00|10.0 2020-01-01 14:00|2.0 2020-01-01 15:00|3.0 2020-01-01 16:00|11.0 2020-01-01 17:00|2.0 2020-01-01 18:00|3.0
|date|value|
DBMS是SQLite
我想得到N个组,并计算每个组的平均值
样本:
2020-01-01 10:00|2.0
2020-01-01 11:00|2.0
2020-01-01 12:00|3.0
2020-01-01 13:00|10.0
2020-01-01 14:00|2.0
2020-01-01 15:00|3.0
2020-01-01 16:00|11.0
2020-01-01 17:00|2.0
2020-01-01 18:00|3.0
结果N=3:
2020-01-01 11:00|7.0/3
2020-01-01 14:00|15.0/3
2020-01-01 17:00|16.0/3
我需要使用一个窗口功能,比如NTILE,但在分组后NTILE似乎不可用。它可以创建bucket,但是如何使用这些bucket进行聚合呢
SELECT
/*AVG(*/value/*)*/,
NTILE (3) OVER (ORDER BY date) bucket
FROM
test
/*GROUP BY bucket*/
/*GROUP BY NTILE (3) OVER (ORDER BY date) bucket*/
还将测试数据和此查询放入。您可以使用NTILE窗口功能创建组和聚合:
SELECT
DATETIME(MIN(DATE), ((STRFTIME('%s', MAX(DATE)) - STRFTIME('%s', MIN(DATE))) / 2) || ' second') date,
ROUND(AVG(value), 2) avg_value
FROM (
SELECT *, NTILE(3) OVER (ORDER BY date) grp
FROM test
)
GROUP BY grp;
要更改每个bucket中的行数,必须更改NTILE括号内的数字3
看。
结果:
您可以使用NTILE窗口功能创建组和聚合:
SELECT
DATETIME(MIN(DATE), ((STRFTIME('%s', MAX(DATE)) - STRFTIME('%s', MIN(DATE))) / 2) || ' second') date,
ROUND(AVG(value), 2) avg_value
FROM (
SELECT *, NTILE(3) OVER (ORDER BY date) grp
FROM test
)
GROUP BY grp;
要更改每个bucket中的行数,必须更改NTILE括号内的数字3
看。
结果:
我需要使用一个窗口功能,比如NTILE,但在分组后NTILE似乎不可用。它可以创建bucket,但是如何使用这些bucket进行聚合呢
SELECT
/*AVG(*/value/*)*/,
NTILE (3) OVER (ORDER BY date) bucket
FROM
test
/*GROUP BY bucket*/
/*GROUP BY NTILE (3) OVER (ORDER BY date) bucket*/
首先使用NTILE在子查询中分配存储桶编号,然后在外部查询中按其分组
使用子查询
选择铲斗
,AVGvalue作为avg_值
从选择值
,NTILE3以桶的形式按日期超过订单
从测试
x
按桶分组
按桶订购
使用WITH子句
以x为
选择日期
价值
,NTILE3以桶的形式按日期超过订单
从测试
选择铲斗
,将*计为桶大小
,自年月日起生效
,MAXdate为截止日期
,MINvalue作为min_值
,AVGvalue作为avg_值
,MAXvalue作为max_值
,SUMvalue作为sum_值
从x
按桶分组
按桶订购
我需要使用一个窗口功能,比如NTILE,但在分组后NTILE似乎不可用。它可以创建bucket,但是如何使用这些bucket进行聚合呢
SELECT
/*AVG(*/value/*)*/,
NTILE (3) OVER (ORDER BY date) bucket
FROM
test
/*GROUP BY bucket*/
/*GROUP BY NTILE (3) OVER (ORDER BY date) bucket*/
首先使用NTILE在子查询中分配存储桶编号,然后在外部查询中按其分组
使用子查询
选择铲斗
,AVGvalue作为avg_值
从选择值
,NTILE3以桶的形式按日期超过订单
从测试
x
按桶分组
按桶订购
使用WITH子句
以x为
选择日期
价值
,NTILE3以桶的形式按日期超过订单
从测试
选择铲斗
,将*计为桶大小
,自年月日起生效
,MAXdate为截止日期
,MINvalue作为min_值
,AVGvalue作为avg_值
,MAXvalue作为max_值
,SUMvalue作为sum_值
从x
按桶分组
按桶订购
不,SQL语言中没有相应地调整GROUP BY表达式的方法。是否也不可能获得每N行的平均值?例如,从表中获取每5行的平均值?使用示例数据和预期结果编辑您的问题,以澄清问题。SQLite中也没有日期格式函数。您的代码是如何工作的?@forpas:我使用了strftime,但现在我重新表述了这个问题,因为如果我可以使用窗口函数,似乎不需要按日期分组。不,在SQL语言中无法相应地调整GROUP by表达式。是否也无法获得每N行的平均值?例如,从表中获取每5行的平均值?使用示例数据和预期结果编辑您的问题,以澄清问题。SQLite中也没有日期格式函数。您的代码是如何工作的?@forpas:我使用了strftime,但现在我重新表述了这个问题,因为如果我可以使用窗口功能,似乎没有必要按日期分组。事实上,我认为我总是需要使用2而不是3-1,这是最大-最小日期的平均值。@Daniel很好,但有一个问题。在这种情况下,数字3将行分成3组,每组包含3行。您的要求是每N行一次。所以,不管怎样,这个办法都行不通。我将编辑我的答案。@Daniel我编辑过。在您的例子中,使用NTILE是错误的,因为NTILEN将表中的行划分为N个组,而不一定在每个组中包含N行。正确的方法是使用ROW_编号。等等,我想我们现在不在同一条道路上:NTILE工作得很好,我需要N个组。但是计算平均日期第一列似乎是错误的,我认为它应该是DATETIMEMINDATE、STRFTIME“%s”、MAXDATE-STRFTIME“%s”、MINDATE/2 | |“second”。如果需要N个组,那么我以前的代码就可以了。但在你的问题中,你说*每N行*。哪一个是正确的?事实上,我认为我总是需要使用2而不是3-1,这是最大-最小日期的平均值。@Daniel很好,但有一个问题。在这种情况下,数字3将行分成3组,每组包含3行。您的要求是每N行一次。所以,不管怎样,这个办法都行不通。我将编辑我的答案。@Daniel我编辑过。在您的例子中,使用NTILE是错误的,因为NTILEN将表中的行划分为N个组,而不一定在每个组中包含N行。正确的方法是排号。等等,我想我们不是
t现在走同一条路:NTILE工作得很好,我需要N个小组。但是计算平均日期第一列似乎是错误的,我认为它应该是DATETIMEMINDATE、STRFTIME“%s”、MAXDATE-STRFTIME“%s”、MINDATE/2 | |“second”。如果需要N个组,那么我以前的代码就可以了。但在你的问题中,你说*每N行*。哪个是正确的?