2017-10-11 1 views
1

Je cours MS SQL-Server-2016 J'essaye d'obtenir la première valeur d'une table partitionnée un ParentId. J'ai un ensemble de données comme ceci:SQL Obtenir la première valeur du tableau

CREATE TABLE #TempTable 
(
    PTORequestDetailId INT, 
    PTORequestId INT, 
    DivisionPTOAccrualId INT, 
    RequestDate DATE, 
    StartTime DateTime, 
    Hours Decimal(19,2), 
    ResponseNotes nvarchar(500), 
    Status int, 
    CreatedOn DateTime, 
    ModifiedOn DateTime 
) 

INSERT INTO #TempTable 
SELECT 60, 48, 139, '2015-09-09', '2015-09-08 20:00:00.000', 8.00,'',0, '2015-09-09 13:30:40.363', '2015-09-09 13:30:40.313' UNION 
SELECT 61, 48, 139, '2015-09-10', '2015-09-09 20:00:00.000', 8.00,'',0, '2015-09-09 13:30:40.363', '2015-09-09 13:30:40.313' UNION 
SELECT 62, 48, 139, '2015-09-11', '2015-09-10 20:00:00.000', 8.00,'',0, '2015-09-09 13:30:40.363', '2015-09-09 13:30:40.313' UNION 
SELECT 63, 48, 139, '2015-09-13', '2015-09-12 20:00:00.000', 8.00,'',0, '2015-09-09 13:30:40.363', '2015-09-09 13:30:40.313' UNION 

CREATE TABLE #TempParent 
(
    PTORequestId INT, 
) 

INSERT INTO #TempParent 
SELECT 48 

Courir Cela va créer une table temporaire avec l'ensemble de données que je travaille avec. Je suis en train de sortir la première valeur pour le DivisionPTOAccrualId divisé par le # TempTable.PTORequestId,

SELECT #TempParent.*, AccrualDetails.* 
FROM #TempParent 
CROSS APPLY (
     SELECT FIRST_VALUE(#TempTable.DivisionPTOAccrualId) 
      OVER (PARTITION BY #TempTable.PTORequestId 
        ORDER BY #TempTable.PTORequestDetailId ASC 
        ROWS UNBOUNDED PRECEDING 
        ) as AccrualId 
     FROM #TempTable 
     WHERE #TempTable.PTORequestId = #TempParent.PTORequestId 
     ) as AccrualDetails 

Je suis essentiellement Essayer d'obtenir 139 une fois par ligne de mes parents, mais le FIRST_VALUE semble revenir plusieurs résultats afin de créer le produit cartésien.

Ainsi, au lieu d'obtenir un seul résultat de ligne du jeu

PTORequestId: 48 AccrualId: 139

Première valeur ne doit renvoyer qu'une seule valeur Cependant, ses 4 valeurs de retour. Pourquoi cela se produit-il, comment puis-je faire FIRST_VALUE retourner une seule valeur par ligne?

EDIT

Je pense que ce phénomène se produit parce que je sélectionne la FIRST_VALUE du TempTable, il est donc sélectionner la première valeur pour chaque ligne du tableau Temp. Mais en fait, je ne le fais qu'une seule fois

Pour tous ceux qui ont besoin de clarification sur ce que je faisais de mal. Je m'attendais à ce que ma partition soit filtrée dans ma table. J'ai supposé depuis SUM sur une table retournera la somme de la table entière au lieu de la somme de la table entière par rangée. Cette somme travail travail basé sur les données partitionnées ce qui n'est pas le cas.

Répondre

2

Je ne suis pas sûr de le faire avec First_Value(), mais je trouve cela plus facile à faire avec Row_Number() et seulement prendre le premier enregistrement:

;With Cte As 
(
    Select T.*, 
      Row_Number() Over (Partition By T.PTORequestId Order By T.PTORequestDetailId) As RN 
    From #TempTable T 
    Join #TempParent P On P.PTORequestId = T.PTORequestId 
) 
Select PTORequestId, DivisionPTOAccrualId As AccruralId 
From Cte 
Where RN = 1 
+0

fonction première valeur fait essentiellement la même chose. La première valeur ne fonctionne pas à cause de comment j'ai tout choisi. Ma jointure crée plusieurs lignes. –

+0

Mais cela m'a aidé à reconnaître mon problème, j'ai besoin de faire plus de recherches avant de pouvoir accepter cette réponse, mais je pense que votre droit, je dois utiliser le numéro de ligne –