Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
Sql 从一类不完整的数据集中获取最大值_Sql - Fatal编程技术网

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;