У меня есть некоторые данные в файлах SQLite, и я хочу манипулировать ими из C #.
Данные состоят из трех столбцов: Time
, Temperature
и Power
. И я хочу найти группы записей, которые имеют Temperature
выше 30, и длятся более 3 минут, и вычислить среднее значение мощности каждой группы (непрерывный диапазон времени).
Выберите непрерывные диапазоны из таблицы
Как выбрать непрерывную дату в 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();
}
}