你好,我想知道如何把.csv的“时间‘日期时间’电压‘双”文件记录下来,每分钟从电表和数据库记录数据,只是想要规范化的数据应该在数据库中?我应该有表表、时刻表、使用表还是电表电压表(双表、时间戳)?
csv文件数据
meterID timeDate Voltages
M1 1/12/2014 5:58:00 117.5
M1 1/12/2014 5:59:00 117.6
M1 1/12/2014 6:00:00 117.5
M1 1/12/2014 6:01:00 117.3发布于 2014-01-18 19:13:57
CSV文件中的数据提供了足够的信息,说明在什么时间,哪个仪表显示了什么读数。我认为,这张表格不应被分解为每一行所包含的信息本身是全面的。在这里创建Times表是没有意义的,因为会有很多次读取数据,因此在查找表中存储时间将是浪费磁盘空间。
如果我正在为您的需求开发一个实时系统,那么您给出的表将是更大模式的一部分。我将创建如下内容:
TABLE customer
( customerID INTEGER PRIMARY KEY
, cust_name VARCHAR(100) NOT NULL
, customer_billing_address VARCHAR(200) NOT NULL
, registration_date DATETIME
, ...
, ... -- Any other columns that you may think appropriate
, ...)
TABLE meter
( meterID INTEGER PRIMARY KEY
, customerID INTEGER
, meter_address VARCHAR(200) NOT NULL
, start_date DATETIME
, ...
, ... -- Any other columns as per your requirements.
, ...
, FOREIGN KEY (customerID) REFERENCES customer(customerID)
-- ^^ This is because one customer may have multiple meters.
)现在,我将从您的问题中提取一个meterReading表。
TABLE meterReading
( meterReadingID INTEGER PRIMARY KEY
, meterID INTEGER NOT NULL
, readingTime DATETIME NOT NULL
, voltage NUMBER(18,2) NOT NULL
, ... -- any other columns
)现在,如果我想看到总电压在一个月内被电表吞噬,因为电表读数是递增的,也就是说,它们不重置,我只需写一个查询,如下所示:
SELECT meterID, MAX(voltage) - MIN(voltage) as consumption
FROM meterReading
WHERE readingTime BETWEEN TO_DATE('01-JAN-2014)
AND TO_DATE('31-JAN-2014) + 86399/86400;最后一次+ 86399/86400是由于以下原因:
31-JAN-2014 00:00:00。+ 86399/86400加了整整一天减去1秒。所以,离01-FEB-2014只有一秒钟的时间。接下来,如果我想查看客户列表以及他们一个月消耗的电量,我只需写以下内容:
SELECT c.cust_name, SUM(mr.consumption) AS total_consumption
FROM customer c INNER JOIN meter m
ON c.customerID = m.customerID
INNER JOIN (SELECT meterID
, MAX(voltage) - MIN(voltage) as consumption
FROM meterReading
WHERE readingTime BETWEEN TO_DATE('01-JAN-2014)
AND TO_DATE('31-JAN-2014)
+ 86399/86400) mr
ON mr.meterID = m.meterID
GROUP BY c.cust_name
ORDER BY SUM(mr.consumption);https://dba.stackexchange.com/questions/57033
复制相似问题