2014-06-26 5 views
1

J'ai un MDM avec des iPhones qui déclarent leur inventaire. Je veux lancer une requête pour obtenir leur historique d'adresses IP pour l'année 2014. Mon objectif était d'obtenir une ligne, par appareil, par jour. J'ai actuellement une requête qui renvoie plusieurs lignes par jour en raison de la fréquence à laquelle ils signalent leur adresse IP au MDM. Par exemple:SQL: Comment limiter une seule date par ligne renvoyée?

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 

Je voudrais que la première entrée par jour, par dispositif, pour l'année 2014.

Ceci est la requête que je suis en cours d'exécution:

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%" 

Le iphone_details table a les colonnes: display_name, device_name et ip_address
Le tableau reports a date_entered

Cette requête génère trop de lignes. J'exécutais cette requête depuis mySQL Workbench et recevais une erreur. Il s'est avéré que c'était parce que le répertoire/tmp sur mon serveur se remplissait. J'ai donc couru la requête directement à partir du serveur mySQL via CLI et sorti les résultats dans un fichier avec INTO OUTFILE et une fois que j'ai vu le fichier de sortie frappé 22G, j'ai arrêté la requête.

J'apprécierais toute direction ou aide avec une requête qui pourrait limiter les résultats. Merci! J'ai trouvé qu'il y a un "report_id" que les iphone_details et reports ont. Est-ce que cela pourrait être utilisé pour les JOIN?

+0

quelle colonne lie 'reports' à' iPhone_details'? Vous ne vous êtes joint à rien. – SQLChao

+0

Par "première entrée", voulez-vous dire l'horodatage le plus tôt ou quelque chose d'autre? – Air

+0

Suppression de la balise [sql-Server], car la question concerne MySQL – Lamak

Répondre

2

Bien qu'il existe quelques problèmes avec votre JOIN, à savoir que vous avez pas de relation entre les rapports et iphone_details et ainsi chaque permutation de chaque rang dans les deux tableaux sera retourné, ce qui suit vous aidera à

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 

Tout d'abord le changement à faire date_entered ENTRE ET (cela correspondra au 2014-12-31 23:59:59) est plus efficace que de faire une recherche en texte intégral sur un champ datetime.

Deuxièmement, le DATE (reports.date_entered) permet uniquement d'extraire la section date du champ datetime. Troisièmement, le GROUP BY garantit que seules des combinaisons distinctes de périphérique, d'adresse IP et de date sont renvoyées.

(modifié pour refléter de nouvelles informations ci-dessous)

+0

sans quelque chose à rejoindre, cela ne fera pas grand chose bien. – Grax

+0

Il n'aura pas ajouté de conseils sur ce point jusqu'à la fin - on dirait que la table a été mal placée au mauvais endroit en partie. Possibilité d'une troisième table pour iphone_details, reports et report_entries. –

+0

'BETWEEN' est inclusif; vous correspondez à un jour supplémentaire. – Air

0

Cela devrait faire en sorte qu'il montre que le plus récent enregistrement pour chaque nom de périphérique.

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 
Questions connexes