2014-06-26 35 views
1

我有一个MDM,有iPhone报告他们的库存。我想运行查询以获取2014年的IP地址历史记录。我的目标是每天每个设备获得一行。我目前有一个查询每天返回多行,因为他们多久将IP报告给MDM。例如:SQL:如何限制每行只返回一个日期?

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目录被填满了。所以我直接从mySQL服务器通过CLI运行查询,并将结果输出到INTO OUTFILE的文件中,当我看到输出文件命中22G时,我停止了查询。

我会感谢任何方向或帮助查询,可能会限制结果。谢谢!编号: 我发现有一个“report_id”,iphone_detailsreports都有。那可以用来JOIN他们吗?

+0

什么专栏链接报告到iPhone_details?你没有加入任何事情。 – SQLChao

+0

“初次登录”是指最早的时间戳还是别的? – Air

+0

删除了[sql-server]标记,因为问题是关于MySQL – Lamak

回答

2

虽然有一些问题,您的联结,即你的报告和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和(这将匹配到2014-12-31 23:59:59)更改比在日期时间字段上进行全文搜索更有效。

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

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

(编辑,以反映低于新品信息)

+0

没有东西可以加入,但这不会做太多。 – Grax

+0

它不会在该分数上添加一些建议 - 感觉就像表格分割被部分放错了位置。可以使用iphone_details,reports和report_entries。 –

+0

'BETWEEN'是包容性的;你正在匹配额外的一天。 – Air

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 
相关问题