SQL:如何限制每行返回一个日期?

时间:2014-06-26 17:51:26

标签: mysql sql

我有一台MDM,其中有iPhone报告其广告资源。我想运行查询以获取2014年的IP地址历史记录。我的目标是每天为每台设备获取一行。我目前有一个查询,每天返回多行,因为他们向MDM报告其IP的频率。例如:

display_name   device_name         ip_address   date_entered
john_smith     john_smiths_iphone  10.1.0.122   2014-05-27 12:36:44
john_smith     john_smiths_iphone  10.1.0.122   2014-05-27 13:34:25
john_smith     john_smiths_iphone  10.1.0.122   2014-05-27 14:12:34
john_smith     john_smiths_iphone  10.1.0.122   2014-05-27 22:56:51
john_smith     john_smiths_iphone  10.1.0.122   2014-05-27 23:06:02

我希望2014年每个设备每天只能输入第一个条目。

这是我目前正在运行的查询:

SELECT iphone_details.display_name
,      iphone_details.device_name
,      iphone_details.ip_address
,      reports.date_entered 
FROM   iphone_details
,      reports 
WHERE  date_entered LIKE "%2014%"

iphone_details表格包含以下列:display_namedevice_nameip_address reports表格有date_entered

此查询导致返回的行太多。我从mySQL Workbench运行此查询并收到错误。原来是因为我服务器上的/ tmp目录正在填满。所以我通过CLI直接从mySQL服务器运行查询,并将结果输出到INTO OUTFILE的文件,一旦我看到输出文件达到22G,我就停止了查询。

我很欣赏任何可能限制结果的查询方向或帮助。谢谢!

编辑: 我发现iphone_detailsreports都有“report_id”。这可以用于JOIN他们吗?

2 个答案:

答案 0 :(得分:2)

虽然您的JOIN存在一些问题,即您在报告和iphone_details之间没有任何关系,因此将返回两个表中每一行的每个排列,以下内容将帮助您

SELECT 
    d.device_id,
    d.display_name, 
    d.device_name, 
    d.ip_address, 
    DATE(reports.date_entered) AS just_date_entered
FROM iphone_details AS d
INNER JOIN reports AS r
    ON r.report_id= d.report_id
    AND r.date_entered >= DATE('2014-01-01') 
    AND r.date_entered < DATE('2015-01-01')
GROUP BY
    d.device_id,
    d.ip_address,
    just_date_entered

首先,更改为date_entered BETWEEN AND(这将匹配到2014-12-31 23:59:59)比在datetime字段上进行全文搜索更有效。

其次,DATE(reports.date_entered)只允许提取日期时间字段的日期部分。

第三,GROUP BY确保只返回设备,IP地址和日期的不同组合。

(编辑以反映下面的新信息)

答案 1 :(得分:0)

这应该使它只显示每个设备名称的最新记录。

WITH CTE as
(
    SELECT ROW_NUMBER() over
        (partition by iphone_details.device_name
            ORDER by date_entered) as rowno,
        iphone_details.display_name, iphone_details.ip_address, iphone_details.date_entered
        FROM SCHEMA.iphone_details
        WHERE iphone_details.date_entered LIKE "%2014%"
)

SELECT *
FROM CTE
WHERE rowno = 1