2014-10-17 42 views
-2

我寫了一個SQL查詢,爲每月的列ipAdressID創建前10位。結果是正確的,但我需要另一種格式的結果。SQL - 列前10位

你能幫我找到正確的格式嗎?

我的SQL查詢

SELECT  
    MyMonth, 
    ipAddress, 
    ID , 
    Records 
FROM  
(
    SELECT  
     MyMonth , 
     ipAddress, 
     ID, 
     Records, 
     ROW_NUMBER() OVER(PARTITION BY MyMonth ORDER BY so.Records DESC) AS RowNum 
    FROM 
    (
     SELECT  
      LEFT(DATENAME(month,startDate),3) + ' ''' + RIGHT(YEAR(startDate),2) AS MyMonth 
      ,ipAddress, ID ,COUNT(1) AS Records 
     FROM 
      [TEST_AUSWERTUNG].[dbo].[Evaluation] 
     GROUP BY 
      LEFT(DATENAME(month,startDate),3) + ' ''' + RIGHT(YEAR(startDate),2) ,ipAddress, ID 
    )so 
)x 
WHERE x.RowNum < 11 

,其結果是例如

Aug'14 145.998.111.115 14 191481 Aug '14 145.998.991.145 E1 81448 Aug '14 11.14.48.11 P4 44544 Aug '14 145.998.49.149 U4 95814 Aug '14 11.4.949.49 CD 94941 Aug '14 11.4.949.45 XT 99449 Aug '14 11.4.949.45 CD 91188 Aug '14 145.998.49.54 XT 91994 Aug '14 11.4.949.49 XT 91954 Aug '14 145.998.49.44 BM 91444 Jun '14 145.998.111.115 14 118494 Jun '14 145.998.991.145 E1 49915 Jun '14 11.14.48.11 P4 41114 Jun '14 145.998.49.159 XB 49414 Jun '14 145.998.49.149 U4 94449 Jun '14 145.998.49.199 XB 94148 Jun '14 11.4.949.49 CD 99154 Jun '14 11.4.949.45 XT 99154 Jun '14 145.998.49.44 XT 91449 Jun '14 145.998.49.54 XT 91554

但我需要這樣的:

Aug'14 145.998.111.115 14 191481 Jun '14 145.998.111.115 14 118494 Aug '14 145.998.991.145 E1 81448 Jun '14 145.998.991.145 E1 49915 Aug '14 11.14.48.11 P4 44544 Jun '14 11.14.48.11 P4 41114 Aug '14 145.998.49.149 U4 95814 Jun '14 145.998.49.159 XB 49414 Aug '14 11.4.949.49 CD 94941 Jun '14 145.998.49.149 U4 94449 Aug '14 11.4.949.45 XT 99449 Jun '14 145.998.49.199 XB 94148 Aug '14 11.4.949.45 CD 91188 Jun '14 11.4.949.49 CD 99154 Aug '14 145.998.49.54 XT 91994 Jun '14 11.4.949.49 CD 99154 Aug '14 11.4.949.49 XT 91954 Jun '14 11.4.949.45 XT 99154 Aug '14 145.998.49.44 BM 91444 Jun '14 145.998.49.44 XT 91449

任何人有一個解決方案?

+0

在'RowNum'上將'Aug'子集和'Jun'子集合在一起。或者按照'RowNum'的方式分組。有很多關於你可以在這個網站搜索的關鍵點的答案。 – 2014-10-17 08:18:21

回答

1

你沒有解釋你想用查詢來實現什麼,我不打算調查它。即便如此,我會讓你知道如何做到這一點:

  • 使用CTE (WITH)使用此查詢,就好像它是一個表
  • 讓與創建的表表達式的兩個不同的查詢:
    • 一個從Aug'14取數據
    • 其他這需要從Jun'14
  • 加入這兩個查詢中的數據,ON ipAddressID

是這樣的(僞):

WITH T (list of fields in your query) 
AS 
(your query) 
SELECT 
    T1.MyMonth, T1.ipAddress, T1.ID, T1.records, 
    T2.MyMonth, T2.ipAddress, T2.ID, T2.records 
FROM 
    (T WHERE MyMonth='Aug ''14') T1 
INNER JOIN 
    (T WHERE MyMonth='Jun ''14') T2 
ON T1.ipAddress = T2.ipAddress and T1.ID = T2.ID 

我敢肯定,你必須知道你想實現什麼,就能提高查詢以某種方式,一旦你讓它工作。

+0

這僅僅是一個月的例子,也可以是「Jun'12」或「Jan'10」。所以這個解決方案不會工作:( – rookie 2014-10-17 08:25:14

+0

是的,這是僞代碼,我不知道你從哪裏得到的,我不知道'startDate'是什麼,請稍微主動,用所需的表達式,也許你必須修改CTE的定義查詢,公開其他字段,使用其他表達式進行過濾等等,這是一種指導,而不是文字上的解決方案,請解決,如果你有任何問題,更新你的問題 – JotaBe 2014-10-17 08:39:45

+0

對不起,但我是一個在sql中的菜鳥,StartDate是數據庫中的一個列,它可以填寫每年的每一個月,查詢應記錄每月ipadress和ID組合的top10每年,我希望這是有用的。 – rookie 2014-10-17 08:47:05