2013-03-14 3 views
0

J'ai une base de données qui a deux tables. Une table Call_Info qui contient des détails sur les appels entrants/sortants et dont l'ID unique est Call_ID. J'ai une deuxième table qui est liée et appelée la table After_Call_Work. Chaque appel ne comportera qu'un seul enregistrement de travail après appel. L'ensemble de données est un peu foiré et pour le même appel il y a parfois 3 ou 4 enregistrements de travail après appel. Comment puis-je faire des requêtes en récupérant simplement le premier enregistrement de travail après appel pour cet appel particulier en ignorant le reste? J'ai imaginé en utilisant la fonction SQL First_Value mais il ne semble pas être le bon. Utilisation de Microsoft SQL Server 2012.Récupération SQL Première ligne de correspondance

Des idées?

+0

Normalement, lorsque vous avez une exigence comme 'chaque appel aura seulement un travail après appel Record' il y a une relation 1 à 1 entre CALL_INFO et AFTER_CALL_WORK: ALTER TABLE AFTER_CALL_WORK AJOUTER CONTRAINTE FK_AFTER_CALL_WORK_CALL_INFO clé étrangère (AFTER_CALL_WORK.ID) références CALL_INFO (CALL_ID); Mais cette contrainte n'était pas en vigueur, comme vous l'avez indiqué, et il y a une relation de 1 à plusieurs. La ligne de travail après appel la plus récente serait déterminée par une colonne date ou datetime dans after-call-work qui reflète sa date de création. Y a-t-il une telle colonne? – Tim

+0

@Tim désolé je ne suis pas revenu à vous. Il y a une colonne starttime dans la table de travail après appel de quand le travail d'après appel a commencé et est maintenu en secondes décalé de 1970. Il devrait être après que l'appel se soit terminé ce qui est trouvé dans la table call_info. Toujours coincé avec ce –

+0

Vous devriez voter pour nos réponses. –

Répondre

0

Ceci peut être réalisé en tirant profit de Window Function

WITH call_List 
AS 
(
    SELECT Call_ID, OtherColumns, DateColumn, 
      ROW_NUMBER() OVER (PARTITION BY Call_ID ORDER BY DateColumn ASC) rn 
    FROM After_Call_Work 
) 
SELECT a.*, b.OtherColumns, b.DateColumn 
FROM Call_Info a 
     INNER JOIN call_List b 
      ON a.Call_ID = b.Call_ID 
WHERE b.rn = 1 
+0

Quelle est la «fonction de fenêtre»? –

+0

@AshBurlaczenko tas de fonction de la fenêtre peut être trouvé ici [pgSQL Window Function] (http://www.postgresql.org/docs/9.2/static/tutorial-window.html) et aussi [** ici **] (http : //msdn.microsoft.com/en-us/library/ms189461.aspx) –

0

Vous devriez être en mesure d'utiliser select top, quelque chose comme ceci:

SELECT TOP 1 
FROM call_info ci JOIN after_call_work acw ON ci.call_id=acw.call_id 
ORDER BY acw.work_time DESC 
WHERE ci.call_id=<your_call_id> 
+0

Notez que ceci est valide si vous demandez un identifiant d'appel particulier. Si vous devez interroger plusieurs appels et obtenir la première correspondance pour chacun d'entre eux, utilisez la solution de JW. –

0
WITH g AS (SELECT ROW_NUMBER() OVER (PARTITION BY callid 
ORDER BY date ASC) AS row,* from after_call_work 
select * from call_info cinfo inner join g on 
cinfo.callid = g.callid and g.row=1 
Questions connexes