Sql 从一类不完整的数据集中获取最大值
许多设备返回一个值。只有在发生更改时,此值才会存储在表中:Sql 从一类不完整的数据集中获取最大值,sql,Sql,许多设备返回一个值。只有在发生更改时,此值才会存储在表中: Device Value Date B 5 2017-07-01 C 2 2017-07-01 A 3 2017-07-02 C 1 2017-07-04 A 6 2017-07-04 值可以在任何日期进入表格,即日期不会连续递增。多个设备可能在同一日期存储其值 请注意,尽管表中每个日期通常只有几个设备,但所有设备在该日期
Device Value Date
B 5 2017-07-01
C 2 2017-07-01
A 3 2017-07-02
C 1 2017-07-04
A 6 2017-07-04
值可以在任何日期进入表格,即日期不会连续递增。多个设备可能在同一日期存储其值
请注意,尽管表中每个日期通常只有几个设备,但所有设备在该日期实际上都有一个值:它是在此之前存储的最新设备。例如,在2017-07-02上,只有设备A存储了一个值。该日期的B和C值为2017-07-01存储的值;这些在-02上仍然有效,只是没有更改
为了检索给定日期(例如2017-07-04)上所有设备的值,我使用以下方法:
select device,value from data internal join select device,maxdate as date from data where date我认为最通用的方法是对每个日期使用单独的查询。根据数据库的不同,肯定有更简单的方法。但获得一个适用于SQLite、MariaDB和Postgres的应用程序不会使用任何复杂的功能:
select '2017-07-01' as date, max(data.value)
from data inner join
(select device, max(date) as date
from data
where date <= '2017-07-01' group by device
) latestdate
on data.device = latestdate.device and data.date = latestdate.date
union all
select '2017-07-02' as date, max(data.value)
from data inner join
(select device, max(date) as date
from data
where date <= '2017-07-02' group by device
) latestdate
on data.device = latestdate.device and data.date = latestdate.date
select '2017-07-03' as date, max(data.value)
from data inner join
(select device, max(date) as date
from data
where date <= '2017-07-03' group by device
) latestdate
on data.device = latestdate.device and data.date = latestdate.date
select '2017-07-04' as date, max(data.value)
from data inner join
(select device, max(date) as date
from data
where date <= '2017-07-04' group by device
) latestdate
on data.device = latestdate.device and data.date = latestdate.date;
这应该是你问题的解决方案。 它应该是跨数据库的,因为大多数数据库都支持OVER子句。 您应该使用查询中的所有datesALL_DATE创建一个表,否则每个数据库都有一种特定的方法在没有表的情况下完成此操作
WITH GROUPED_BY_DATE_DEVICE AS (
SELECT DATE, DEVICE, SUM(VALUE) AS VALUE FROM DEVICE_INFO
GROUP BY DATE, DEVICE
), GROUPED_BY_DATE AS (
SELECT A.DATE, MAX(VALUE) AS VALUE
FROM ALL_DATE A
LEFT JOIN GROUPED_BY_DATE_DEVICE B
ON A.DATE = B.DATE
GROUP BY A.DATE
)
SELECT DATE, MAX(VALUE) OVER (ORDER BY DATE) AS MAX_VALUE
FROM GROUPED_BY_DATE
ORDER BY DATE;
提示:与日历表进行外部联接以包括缺少的日期。
Date max(value)
2017-07-01 5
2017-07-02 5
2017-07-03 5
2017-07-04 6
select '2017-07-01' as date, max(data.value)
from data inner join
(select device, max(date) as date
from data
where date <= '2017-07-01' group by device
) latestdate
on data.device = latestdate.device and data.date = latestdate.date
union all
select '2017-07-02' as date, max(data.value)
from data inner join
(select device, max(date) as date
from data
where date <= '2017-07-02' group by device
) latestdate
on data.device = latestdate.device and data.date = latestdate.date
select '2017-07-03' as date, max(data.value)
from data inner join
(select device, max(date) as date
from data
where date <= '2017-07-03' group by device
) latestdate
on data.device = latestdate.device and data.date = latestdate.date
select '2017-07-04' as date, max(data.value)
from data inner join
(select device, max(date) as date
from data
where date <= '2017-07-04' group by device
) latestdate
on data.device = latestdate.device and data.date = latestdate.date;
WITH GROUPED_BY_DATE_DEVICE AS (
SELECT DATE, DEVICE, SUM(VALUE) AS VALUE FROM DEVICE_INFO
GROUP BY DATE, DEVICE
), GROUPED_BY_DATE AS (
SELECT A.DATE, MAX(VALUE) AS VALUE
FROM ALL_DATE A
LEFT JOIN GROUPED_BY_DATE_DEVICE B
ON A.DATE = B.DATE
GROUP BY A.DATE
)
SELECT DATE, MAX(VALUE) OVER (ORDER BY DATE) AS MAX_VALUE
FROM GROUPED_BY_DATE
ORDER BY DATE;