2010-05-05 13 views
1

Bonjour EVery Je suis nouveau à SQl. requête pour aboutir aux enregistrements suivants.Sélectionnez un enregistrement distinct, le filtrage ne fonctionne pas

J'ai une table avec des dossiers comme

c1 c2   c3     c4 c5 c6 

1 John   2.3.2010 12:09:54  4  7 99   
2 mike   2.3.2010 13:09:59  8  6 88 
3 ahmad   2.3.2010 13:09:59  1  9 19 


4 Jim  23.3.2010 16:35:14  4  5 99 
5 run  23.3.2010 12:09:54  3  8 12 

Je veux fecth uniquement les enregistrements. i.e seulement 1 dernier enregistrement par jour. Si les deux se produisent en même temps, trier par C1.so en 1 & 3 devrait chercher 3.

3 ahmad   2.3.2010 14:09:59  1  9 19 
4 Jim  23.3.2010 16:35:14  4  5 99 

J'ai un nouveau problème dans ce domaine. Si je filtre les enregistrements en fonction des conditions, le dernier enregistrement est manquant. J'ai essayé de nombreuses façons, mais il échoue toujours. Ici, update_log est ma table.

SELECT * FROM update_log t1 
WHERE (t1.c3) = 
(
    SELECT MAX(t2.c3) 
    FROM update_log t2 
    WHERE DATEDIFF(dd,t2.c3, t1.c3) = 0 
) 
and t1.c3 > '02.03.2010' and t1.modified_at <= '22.03.2010' 

ORDER BY t1.c3 ASC. Mais je ne suis pas en mesure de récupérer l'enregistrement

4 Jim  23.3.2010 16:35:14  4  5 99 

Je ne sais pas ce résultat de la requête en seulement

3 ahmad   2.3.2010 14:09:59  1  9 19 

Le format de la c3 colonne est datetime. Je pomper les données dans la colonne comme en utilisant $date = date("d.m.Y H:i",time()); - simple extraction de date d'aujourd'hui.

Une autre requête que j'ai essayée dans le même but.

select * from (select convert(varchar(10), c3,104) as date, max(c3) as max_date, max(c1) as Nr from update_log group by convert(varchar(10), c3,104)) as t2 inner join update_log as t1 on (t2.max_date = t1.c3 and convert(varchar(10), c3,104) = date and t1.[c1]= Nr) WHERE t1.c3 >= '02.03.2010' and t1.c3 <= '16.04.2010'. J'ai même essayé ce way..the même erreur dernier enregistrement ne vient pas ..

+0

Où est la colonne Modified_at dans votre tableau? – codingbadger

Répondre

-1

OK, maintenant j'ai compris. En fait, j'ai écrit la requête dans le même but de cette façon.

select * from #temp 
select * from 
(select max(c1) as nr from 
(select convert(varchar(10), c3,104) as date, max(c3) as max_date 
from #temp where 
convert(varchar(10),c3,104) >= '02.02.2010' and 
convert(varchar(10),c3,104) <= '23.02.2010' 
group by convert(varchar(10), c3,104)) 
as t2 inner join #temp as t1 on (t2.max_date = t1.c3 and 
convert(varchar(10), c3,104) = date) 
group by convert(varchar(10),max_date,104)) 
as t3 inner join #temp as t4 on (t3.nr = t4.c1) 

Si je change ces 2 lignes en c3> = '02 .02.2010 'et c3 < = '24 .02.2010'. Cela fonctionne bien. mais la requête que j'ai posté n'est pas capable de filtrer les enregistrements correctement en fonction des dates.

Je veux savoir où je suis allé mal pour améliorer mon knoweldge plutôt que se contenter de copier ur requête :-)

+0

-1 "Modifiez votre question pour ce genre de choses, car ce n'est pas une réponse à votre question, ne la mettez pas avec les réponses!" –

+0

@help_inmssql - Comme c3 a une date ** et ** heure, * c3 <= convertir (varchar (10), '23.03.2010', 104) * est comme demander à l'ordinateur si 9.3413 <= 9.0000. –

0

Les étapes suivantes devraient produire les résultats que vous êtes après

  • Recherche max c3 pour tous les jours.
  • Joignez les résultats avec votre table d'origine, en ne tenant compte que des valeurs max c1.

Déclaration SQL (Edited)

DECLARE @update_log TABLE (c1 INTEGER, c3 DATETIME) 

INSERT INTO @update_log 
SELECT 1, '3.2.2010 12:09:54' 
UNION ALL SELECT 2, '3.2.2010 13:09:59' 
UNION ALL SELECT 3, '3.2.2010 13:09:59' 
UNION ALL SELECT 4, '3.23.2010 16:35:14' 
UNION ALL SELECT 5, '3.23.2010 12:09:54' 

SELECT c1 = MAX(l.c1), l.c3 
FROM @update_log l 
     INNER JOIN (
      SELECT c3_max = MAX(c3)  
      FROM @update_log 
      WHERE c3 > '3.2.2010 00:00:00' 
        AND c3 < '3.24.2010 00:00:00' 
      GROUP BY 
        CONVERT(VARCHAR(10), c3, 101) 
     ) l_maxdate ON l_maxdate.c3_max = l.c3 
GROUP BY 
     l.c3 

Remarques

Vous devriez lire le FAQ en ce qui concerne la façon dont fonctionne ce site. Comme cela a été mentionné, Stack Overflow n'est pas destiné à être utilisé comme on utiliserait un lecteur de news où vous posez des questions de suivi après qu'une réponse a été donnée en créant une nouvelle réponse.

Vous devez éditer votre question pour toute information supplémentaire ou utiliser les commentaires. Si les informations supplémentaires sont si importantes qu'elles modifient en fait toute la question, vous devriez envisager de faire une nouvelle question.

Cela étant dit, profitez-en.

+0

@help_inmssql - J'ai modifié la requête. Pourriez-vous vérifier les résultats? –

0

En supposant c1 est unique, je l'espère même la clé primaire. Cela suppose également l'utilisation de SQL Server 2008 pour le type de données DATE.

SELECT t1.* 
FROM update_log t1 
WHERE t1.c3 > '02.03.2010' 
    AND t1.modified_at <= '22.03.2010' 
    AND t1.c1 IN 
    (SELECT TOP 1 c1 
     FROM update_log t2 
     WHERE CAST(t1.c3 As DATE) = CAST(t2.c3 As DATE) 
     ORDER BY c3 DESC, c1 DESC 
    ) 
Questions connexes