我有一个返回一些数据的查询
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
答案 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函数将返回两行以上。