2016-04-18 14 views
9

ben tabloda zaman verileri: Category_Prob OysaHesaplanan sütun

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 ... 

hesaplanır hesaplanmış bir sütun: Ben sorgunun bir çıkış istiyorum ise

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 ... 

olarak iki adımda:

Adım İlk biz Paper_Count bir SUM EAC içinde olması gerekir Paper_Year = 2005 ve Author_ID = 677 yani mesela h Paper_Year, İkinci SUM(Paper_Count) = 3

Adım, daha sonra her Category_ID için, biz

... vb 1/3 yani 0.333 ve olacağını Paper_Year içinde SUM(Paper_Count) değeri ile Paper_Count bölmek zorunda

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 

Ama döndürür:

Üstelik ben bu sorguyu denedi Tablodaki tüm satırlar için Category_Prob sütununda yalnızca 1.

yardım edin!

cevap

6

talebinizle ilgili sorun Author_ID, Abstract_Category, Paper_Count, Rank tarafından da Paper_Year göre gruplama, ama olmamasıdır. Dolayısıyla, her bir grup için SUM(Paper_Count), Paper_Count öğesine eşittir.

Bunun için SUM OVER kullanabilirsiniz:

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 

Not: Sen tamsayı bölme mani olmak için 1.0 ile çarpmak gerekir. Not 2: Belki de asıl gereksinim yazar, yıl tarafından gruplandırılacaksa, alanını PARTITION BY maddesine eklemelisiniz.

+0

@ Giorgos - Sorgu başarılı bir şekilde yürütüldü, ancak hesaplanan değerler_column'daki değerler istenen gibi değil – maliks

+0

@Bridge Bence değil. 'SUM' ile' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'SQL Server 2005'ten itibaren mevcuttur (% 100 emin olmasa bile) Sql Server 2012, "toplam" deyiminde "ORDER BY" ifadesini ekleyerek, toplamları hesaplamak için ekledi. –

+0

@GiorgosBetsos Haklısınız, benim hatam – Bridge

0

İlgili tüm alanların veri türünün integers olduğunu şüpheliyim (lütfen onaylayın). int ile hesapladığınızda, dönüş türü de int olur. Hesaplamadan önce convert alanları decimal olmalıdır.

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