2014-06-26 41 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 
相關問題