2017-10-19 12 views
0

Salut les gars j'ai besoin de votre aide sur celui-ci:Créer une colonne de groupe sur la base des lignes spécifiques

J'ai besoin pour remplir une colonne supplémentaire (répertoire) dans le serveur SQL basé sur certaines lignes spécifiques. Pour ce faire, je dois évaluer la colonne (nom de fichier) et le répliquer sur la colonne (répertoire) jusqu'à ce que le mot-clé change. Ainsi, la table originale est comme ceci:

enter image description here

Et voici ce que je dois accomplir:

enter image description here

Puis-je utiliser CTE? Comment?

Merci d'avance!

+1

données toujours après l'échantillon sous forme de texte, au lieu de l'image –

+0

Je suis d'accord avec @P ரதீப் - Et voici quelques raisons supplémentaires pour lesquelles c'est une bonne chose à faire. ► [https://meta.stackoverflow.com/questions/285551/why-not-upload-images-of-code-on-so-when-asking-a-question] – STLDeveloper

Répondre

0

Si le format de nommage directory est cohérent que vos données d'échantillon alors voici une façon

SELECT id,Filename, 
     Directory = Min(Filename)OVER(partition BY grp) 
FROM (SELECT *, 
       grp= Sum(CASE WHEN Filename LIKE '-%' THEN 1 ELSE 0 END) 
         OVER(ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)    
     FROM Yourtable) a 

Une autre méthode moins dépendante de convention de nommage

SELECT id, 
     Filename, 
     Directory = Max(iDirectory)OVER(partition BY grp) 
FROM (SELECT Id, 
       Filename, 
       grp, 
       iDirectory=CASE WHEN Row_number() OVER(partition BY grp ORDER BY id) = 1 THEN Filename ELSE NULL END 
     FROM (SELECT *, 
         grp= Sum(CASE WHEN Filename LIKE '-%' THEN 1 ELSE 0 END) 
           OVER(ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 
       FROM #test) a)b 
+0

Merci beaucoup P ரதீப்! – user2811907

0
declare @tt table (id int identity(1,1), [FileName] varchar(50), DirectoryName varchar(50)) 
insert into @tt([FileName]) values 
('- Directory 1') 
,('File a') 
,('File b') 
,('File c') 
,('- Directory 2') 
,('File d') 
,('File e') 
,('File f') 
,('File g') 

SELECT A.ID, A.[FILENAME], 
    (
     SELECT TOP 1 [FILENAME] FROM @TT AS B 
     WHERE [FILENAME] LIKE '- DIRECTORY%' 
     AND B.ID <= A.ID 
     ORDER BY B.ID DESC 
    ) AS DIRECTORYNAME 
FROM @TT AS A