2016-04-18 14 views
9

Ho i miei dati nella tabella come:colonna calcolata in SQL Server

id Author_ID Research_Area  Category_ID Paper_Count Paper_Year Rank 
--------------------------------------------------------------------------------- 
1 677   feature extraction 8   1    2005   1 
2 677   image annotation 11   1    2005   2 
3 677   probabilistic model 12   1    2005   3 
4 677   semantic   19   1    2007   1 
5 677   feature extraction 8   1    2009   1 
6 677   image annotation 11   1    2011   1 
7 677   semantic   19   1    2012   1 
8 677   video sequence  5   2    2013   1 
9 1359  adversary model  1   2    2005   1 
10 1359  ensemble method  14   2    2005   2 
11 1359  image represent  11   2    2005   3 
12 1359  adversary model  1   7    2006   1 
13 1359  concurrency control 17   5    2006   2 
14 1359  information system 12   2    2006   3 
15 ...   
16 ... 

Mentre io voglio avere una potenza di interrogazione come:

id Author_ID Category_ID Paper_Count Category_Prob Paper_Year Rank 
--------------------------------------------------------------------------------- 
1 677   8   1    0.333   2005   1 
2 677   11   1    0.333   2005   2 
3 677   12   1    0.333   2005   3 
4 677   19   1    1.0    2007   1 
5 677   8   1    1.0    2009   1 
6 677   11   1    1.0    2011   1 
7 677   19   1    1.0    2012   1 
8 677   5   2    1.0    2013   1 
9 1359  1   2    0.333   2005   1 
10 1359  14   2    0.333   2005   2 
11 1359  11   2    0.333   2005   3 
12 1359  1   7    0.5    2006   1 
13 1359  17   5    0.357   2006   2 
14 1359  12   2    0.142   2006   3 
15 ...   
16 ... 

Mentre Category_Prob è una colonna calcolata che viene calcolato in due passaggi come:

Primo passo, dobbiamo avere un SUM di Paper_Count in eac h Paper_Year per esempio cioè Paper_Year = 2005 e Author_ID = 677, il SUM(Paper_Count) = 3

seconda fase, allora per ogni Category_ID, dobbiamo dividere Paper_Count con valore SUM(Paper_Count) dal fatto che Paper_Year che sarà 1/3 cioè 0.333 e così via ...

Inoltre, ho provato questa query:

SELECT 
    Author_ID, Abstract_Category, Paper_Count, 
    [Category_Prob] = Paper_Count/SUM(Paper_Count), 
    Paper_Year, Rank 
FROM 
    Author_Areas 
GROUP BY 
    Author_ID, Abstract_Category, Paper_Year, Paper_Count, Rank 
ORDER BY 
    Author_ID, Paper_Year 

ma restituisce solo 1 nella colonna Category_Prob per tutte le righe nella tabella.

Si prega di aiuto!

risposta

6

Il problema con la query è che non si raggruppamento per Paper_Year, ma anche da Author_ID, Abstract_Category, Paper_Count, Rank. Quindi SUM(Paper_Count) equivale a Paper_Count per ciascun gruppo.

È possibile utilizzare SUM OVER per questo:

SELECT  id, Author_ID, Abstract_Category [Category_ID], 
      Paper_Count, 
      Paper_Count * 1.0/SUM(Paper_Count) 
      OVER (PARTITION BY Author_ID, Paper_Year) AS [Category_Prob], 
      Paper_Year, Rank 
FROM  Author_Areas 
ORDER BY Author_ID, Paper_Year 

Nota: Dovete moltiplicare per 1.0 in modo da evitare la divisione intera. Nota 2: Forse è necessario aggiungere il campo Author_ID nella clausola PARTITION BY, se il requisito effettivo è quello di raggruppare per autore, anno.

+0

@ Giorgos - La query è stata eseguita correttamente ma i valori nella colonna 'calculate_column' non sono quelli desiderati – maliks

+0

@Bridge, penso di no. 'SUM' con la clausola' OVER' è disponibile da SQL Server 2005 in poi (non sicuro al 100%). Sql Server 2012 ha aggiunto il comando 'ORDER BY' nella clausola' OVER' in modo da calcolare i totali parziali. –

+0

@GiorgosBetsos Hai ragione, mio ​​errore – Bridge

0

Sospetto (confermare) che il tipo di dati di tutti i campi coinvolti sia integers. Quando si calcola con int, il tipo di reso è anche int. È necessario convert i campi per decimal prima del calcolo.

SELECT Author_ID, Abstract_Category, Paper_Count, 
[Category_Prob] = convert(decimal(10,3), Paper_Count)/convert(decimal(10, 3), SUM(Paper_Count)), 
Paper_Year, Rank 
FROM Author_Areas 
GROUP BY Author_ID, Abstract_Category, Paper_Year, Paper_Count, Rank 
ORDER BY Author_ID, Paper_Year