Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/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
Sqlite SQL:分组以获得精确的行_Sqlite - Fatal编程技术网

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行*。哪个是正确的?