【发布时间】:2019-11-04 03:43:19
【问题描述】:
我在 SQLite 文件中有一些数据,并且想从 C# 中对其进行操作。
数据包括三列,Time、Temperature 和Power。我想找到Temperature大于30,持续时间超过3分钟的记录组,并计算每组的平均功率(连续时间范围)。
Select continuous ranges from table
How to Select continuous date in sql
我在上面找到了两个答案,但无法达到我的答案。
可以直接使用 SQL 字符串获取结果(对于 SQLiteDataAdapter)。或选择所有数据并使用 c#(datatable.Select、Computer 或 LINQ)对其进行操作。
| No | Time | Temp | Power |
| ---- | ----------------- | ---- | ----- |
| 1 | 2019-11-4 0:00:00 | 25 | 1200 |
| 2 | 2019-11-4 0:01:10 | 30 | 1000 |
| 3 | 2019-11-4 0:02:20 | 31 | 680 |
| 4 | 2019-11-4 0:03:30 | 34 | 960 |
| 5 | 2019-11-4 0:04:40 | 29 | 800 |
| 6 | 2019-11-4 0:05:50 | 31 | 600 |
| 7 | 2019-11-4 0:07:00 | 32 | 400 |
| 8 | 2019-11-4 0:08:10 | 33 | 900 |
| 9 | 2019-11-4 0:09:20 | 34 | 1000 |
| 10 | 2019-11-4 0:10:30 | 39 | 200 |
| 11 | 2019-11-4 0:11:40 | 24 | 350 |
预期结果:选取Temp大于30且连续时间大于3分钟的连续记录为一组,计算Power的均值。
示例表中的一组,包括从 6 到 10 的编号。平均值为 620。
感谢大家。我作品中使用的代码:
string sql = "WITH CTE AS (" +
"SELECT(Temp > 30) AS tempgt30,Time, Power," +
"ROW_NUMBER() OVER(ORDER BY No) rn," +
"ROW_NUMBER() OVER(PARTITION BY(Temp > 30) ORDER BY No) rn2" +
" FROM data" +
")" +
" SELECT MIN(rn)AS minrow,MAX(rn) as maxrow," +
"strftime('%s', MAX(Time)) - strftime('%s', MIN(Time)) AS duration," +
"AVG(Power) AS mean" +
" FROM CTE" +
" WHERE tempgt30" +
" GROUP BY(rn2 - rn)" +
" HAVING duration > 180;";
con.Open();
if (con.State == ConnectionState.Open)
{
using (SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(sql, con))
{
dataAdapter.Fill(datatable);
con.Close();
}
}
【问题讨论】: