返回SQL查询的每列的顶部值

时间:2015-08-10 15:47:18

标签: sql sql-server-2008

我有一个返回一些数据的查询

Name Hour1 hour2 hour3 etc
A    1     2      3    ...  
B    50    2      25   ... 
C    25    2      3    ... 
D    1     30     50   ... 
E    1     40     3    ... 

我想在每列中得到前两个结果的值(值组成)

Name Hour1 hour2 hour3 etc
A    null  null  null  ...  
B    50    null  25    ... 
C    25    null  null  ... 
D    null  30    50   ... 
E    null  40    null ... 

可以有很多名称和24小时列。 这可能吗?

现有查询的格式为

SELECT Name,
    ISNULL(Count(CASE WHEN DATEPART(HOUR,OpenedDate)=1 THEN 1 ELSE null END), 0) AS Hour1,
etc
etc
From DataTable

2 个答案:

答案 0 :(得分:1)

我会将您的查询编写为:

SELECT Name,
       SUM(CASE WHEN DATEPART(HOUR, OpenedDate) = 1 THEN 1 ELSE 0 END) AS Hour1,
       . . .
FROM DataTable
GROUP BY Name;

要获得前2个值,您可以枚举DataTable

select name,
       max(case when hr = 1 and seqnum <= 2 then cnt end) as hr_1,
       . . .
from (select t.*, DATEPART(HOUR, OpenedDate) as hr, count(*) as cnt,
             row_number() over (partition by datepart(hour, OpenedDate)
                                order by count(*) desc) as seqnum
      from datatable t
      group by name, DATEPART(HOUR, OpenedDate)
     ) t
group by name;

子查询按名称和小时汇总数据。然后它枚举值并将其用于条件聚合。

您可能需要dense_rank()而不是row_number(),具体取决于您希望如何处理关系。

答案 1 :(得分:1)

一个选项可能是将公用表表达式与数据透视表一起使用。

@echo off

set dirpath="My path is here"

(
echo ^^$
echo Summary Report:
echo Source statistics:
echo Unprocessed:
echo Quarantined:
echo With Failures:
echo Imported:
echo Total Sources:
echo Message statistics:
echo Unprocessed:
echo Failed:
echo Success:
echo Excluded:
echo Ignored:
echo Total Messages:
)> "%temp%\findstr.txt"

for /f "delims=" %%x in ('dir /od /a-d /b "%dirpath%"') do set "recent=%%x"

findstr /i /g:"%temp%\findstr.txt" "%dirpath%\%recent%" > "C:\Users\Pictures\scripts\test.log"

del "%temp%\findstr.txt"
call "C:\Users\Pictures\AutoEmailSend.vbs"
Exit 0

请注意,如果存在关联,则rank函数将返回两行以上。