2014-10-17 51 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