2017-07-17 1 views
3

J'ai besoin de trouver la première date où Ten_Yr_CAPE n'a pas de valeur 0. table de sortie doit avoir la colonne Pays et date Colonne sur laquelle a La date à laquelle Ten_Yr_CAPE est devenue supérieure à 0.Comment trouver la première ligne dont la valeur n'est pas égale à zéro

j'ai écrit la requête ci-dessous, mais il tire tous les documents ayant « Ten_Yr_CAPE » <> 0. J'ai besoin que la date initiale. Quelqu'un peut-il m'aider.

Select TOP (1) renvoie un seul enregistrement. J'ai besoin d'un enregistrement pour chaque pays. Donc, tout à fait 20 enregistrements pour chaque pays

select [Date],[Country] from [Tableau].[dbo].[Country_table4$] where 
    [Ten_Yr_CAPE] <> 0 
    Group by [Country], [Date] 
    Order by [Date] ASC 
+0

ASTUCE: 'SELECT TOP (1) [Date], [Pays]' Cochez [** manual **] (https://docs.microsoft.com/en-us/sql/t-sql/queries/top-transact -sql) –

+0

Sélectionner TOP (1) retourner ns un seul enregistrement. J'ai besoin d'un enregistrement pour chaque pays. Donc, totalement 20 enregistrements pour chaque pays –

+0

Je vois, je pensais que vous en avez seulement besoin. C'est pourquoi mieux vaut fournir quelques exemples de données et la production attendue. –

Répondre

3

Vous pouvez utiliser le dessus (1) ayant des liens ci-dessous:

select top (1) with ties [Date],[Country] 
from [Tableau].[dbo].[Country_table4$] 
where [Ten_Yr_CAPE] <> 0 
order by row_number() over(partition by [Country] order by [Date] ASC) 
+0

Cela fonctionne bien .. Merci !! –

+0

Quelle est la syntaxe? Est-ce juste un CTE? Je ne l'ai jamais vu écrit comme ça ... –

+0

C'est de loin la réponse la plus déroutante: p –

4
SELECT * 
FROM (  
    SELECT *, ROW_NUMBER() OVER (PARTITION BY [COUNTRY] 
            ORDER BY [Date]) as rn 
    FROM [Tableau].[dbo].[Country_table4$] 
    WHERE [Ten_Yr_CAPE] <> 0) AS T 
WHERE T.rn = 1 
+0

Ma réponse fonctionne pour les cas où vous avez besoin de plusieurs champs pour la même ligne, mais dans ce cas vous n'avez besoin que de la date , c'est mieux de simplement "grouper" comme @Gordon l'a fait. –

4

Je pense que l'agrégation est la méthode la plus simple:

select t.[Country], min(t.[Date]) 
from [Tableau].[dbo].[Country_table4$] t 
where [Ten_Yr_CAPE] <> 0 
Group by [Country] 
Order by [Date] ASC 
+1

Cela semble être la meilleure réponse, en supposant que cela fonctionne au besoin –