首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >电表数据设计数据库?

电表数据设计数据库?
EN

Database Administration用户
提问于 2014-01-18 01:01:36
回答 1查看 2.2K关注 0票数 1

你好,我想知道如何把.csv的“时间‘日期时间’电压‘双”文件记录下来,每分钟从电表和数据库记录数据,只是想要规范化的数据应该在数据库中?我应该有表表、时刻表、使用表还是电表电压表(双表、时间戳)?

csv文件数据

代码语言:javascript
运行
复制
 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
EN

回答 1

Database Administration用户

回答已采纳

发布于 2014-01-18 19:13:57

CSV文件中的数据提供了足够的信息,说明在什么时间,哪个仪表显示了什么读数。我认为,这张表格不应被分解为每一行所包含的信息本身是全面的。在这里创建Times表是没有意义的,因为会有很多次读取数据,因此在查找表中存储时间将是浪费磁盘空间。

如果我正在为您的需求开发一个实时系统,那么您给出的表将是更大模式的一部分。我将创建如下内容:

代码语言:javascript
运行
复制
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表。

代码语言:javascript
运行
复制
TABLE meterReading
( meterReadingID                 INTEGER        PRIMARY KEY
, meterID                        INTEGER        NOT NULL
, readingTime                    DATETIME       NOT NULL
, voltage                        NUMBER(18,2)   NOT NULL
, ... -- any other columns
)

现在,如果我想看到总电压在一个月内被电表吞噬,因为电表读数是递增的,也就是说,它们不重置,我只需写一个查询,如下所示:

代码语言:javascript
运行
复制
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是由于以下原因:

  1. 当我们只使用日期值而不使用时间信息时,大多数数据库将其视为一天的开始,例如31-JAN-2014 00:00:00
  2. 一天有86400秒。所以,+ 86399/86400加了整整一天减去1秒。所以,离01-FEB-2014只有一秒钟的时间。

接下来,如果我想查看客户列表以及他们一个月消耗的电量,我只需写以下内容:

代码语言:javascript
运行
复制
  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);
票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/57033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档