2012-04-20 66 views
4

我必須按小時排序某人從特定國家/地區撥打的次數。國家名單按月增加,例如我們可以添加巴西。我正在使用SQL Server。SQL Server - 顯示列表中的熱門條目

數據看起來像這樣

2012-04-02 08:00:59 United States 
2012-04-02 08:12:02 United States 
2012-04-02 08:13:42 Canada 
2012-04-02 08:13:56 United States 
2012-04-02 08:14:07 Mexico 
2012-04-02 08:18:09 Canada 
2012-04-02 08:19:50 United States 
2012-04-02 08:34:34 Mexico 
etc. 

我怎麼想列出的數據是由前2個國家的小時

我想它顯示,如:

Date     Country   Calls 
2012-04-02 08:00:00 United States 24 
2012-04-02 08:00:00 Canada   19 
--hidden-- 
2012-04-02 08:00:00 Mexico   12 

,我試圖(不工作)的代碼:

Declare @StartDate datetime, @EndDate datetime 
    set @StartDate = '20120401 00:00:00' 
    set @EndDate = '20120430 23:59:59' 
SELECT DATEADD(HOUR, DATEPART(HOUR, [date]), DATEDIFF(DAY, 0, [date])) as [date], 
(SELECT COUNT([country]) FROM [mytable] WHERE [date] between @StartDate and @EndDate and [country] = 'United States') as [United_States] 
,(SELECT COUNT([country]) FROM [mytable] WHERE [date] between @StartDate and @EndDate and [country] = 'Canada') as [Canada] 
,(SELECT COUNT([country]) FROM [mytable] WHERE [date] between @StartDate and @EndDate and [country] = 'Mexico') as [Canada] 
FROM [mytable] 
WHERE [date] between @StartDate and @EndDate 
GROUP BY DATEADD(HOUR, DATEPART(HOUR, [date]), DATEDIFF(DAY, 0, [date])) 
ORDER BY [date] 

謝謝。

+0

你如何獲得電話的數量? – Matthew 2012-04-20 22:15:55

+0

電話的數量只是爲了舉例說明我想如何排序,我還沒有一個公式可以找出確切數量 – Brad 2012-04-20 22:21:20

+0

您需要在最長時間內來自每個國家的電話數量?每一天?每個小時?對於每個月? – daniloquio 2012-04-20 22:22:46

回答

1

這應做到:

Declare @StartDate datetime, 
    @EndDate datetime 
    set @StartDate = '20120401 00:00:00' 
    set @EndDate = '20120430 23:59:59' 

;WITH 
    mytablePlusHours As 
(
    SELECT *, 
     DATEADD(HOUR, DATEPART(HOUR, [date]), DATEDIFF(DAY, 0, [date]))  AS [dateHour] 
    FROM [mytable]  
) 
, mytableHourGroups As 
(
    SELECT dateHour, 
      country, 
      COUNT(*)  As [countryCount], 
      ROW_NUMBER() OVER(PARTITION BY dateHour ORDER BY countryCount) 
          As [countryRank] 
    FROM  mytablePlusHours 
    GROUP BY dateHour, country 
) 
SELECT 
     dateHour  AS [date], 
     country, 
     countryCount 
FROM mytableHourGroups 
WHERE [date] between @StartDate and @EndDate 
    AND countryRank <= 2 
ORDER BY [date], countryRank 
0

我相信最簡單的解決方案分兩步走。

首先,您必須將日期時間轉換爲偶數小時。通過將數據從一個表複製到另一個表或通過視圖或將計算字段添加到表中來完成。

然後,你做這樣的事情

select date time, country, count(*) calls 
from mytable 
group by date, country 

我不知道它是 「COUNT(*)」 - 有人請指正。

1

試試這個。也許有一些語法錯誤,但我認爲它正確的方向。

SELECT T1.Date, T1.Country, SUM(1) 
FROM CallsTable T1 
GROUP BY DATEADD(hh, DATEDIFF(hh,0,T1.Date),0), T1.Country 
HAVING T1.Country IN (SELECT TOP 2 T2.Country 
         FROM CallsTable T2 
         WHERE DATEADD(hh, DATEDIFF(hh,0,T2.Date),0) = DATEADD(hh, DATEDIFF(hh,0,T1.Date),0) 
         GROUP BY T2.Country 
         ORDER BY SUM(1) DESC      
        ) 

說明:

DATEADD(hh, DATEDIFF(hh,0,T1.Date),0)由小時截斷分鐘和秒,以組。

按小時和國家的主要選擇組。內部選擇是一個過濾器,因此只顯示指定小時的兩個頂部 呼叫國家。

0

添加到達倫·戴維斯的回答,您可以進一步定義表輸出的日期和時間來解決:

SELECT 
    DATEADD(dd, 0, DATEDIFF(dd, 0, [Date])) as Date, 
    DATEPART(HOUR, [Date]) as Hour, 
    Country, 
    SUM(Calls) 
FROM YourTable 
GROUP BY 
    DATEADD(dd, 0, DATEDIFF(dd, 0, [Date])), 
    DATEPART(HOUR, [Date]), 
    Country 
0

未經測試:

SELECT date(yourdate) as mday, 
     datepart(hour, yourdate) as Yourhour, 
     country, 
     count(*) as calls, 
     ROW_NUMBER() OVER(PARTITION BY date(YourDate) & "-" & Datepart(hour,YourDate) & ORDER BY count(*) DESC) myCount 
FROM yourTableName 
GROUP BY date(yourdate), datepart(hour, yourdate) 
having myCount <3 
Order by count(*), mday, yourhour 

不知怎的,ROW_NUMBER()過(partiion通過..看起來像它會得到你想要的東西,但我無法測試它,請參見MSFT ARTICLE以供使用,爲什麼我認爲這是你的事情之後

實質上,你想創建每天和每小時的不同分區,按該分區集內的呼叫次數排序,併爲每個記錄/計數分配一個從1開始增加1的數字。然後,您希望將該記錄/計數限制在每天/小時分組的前兩位。

1

使用cteover第這是比較容易和可讀性:

WITH CTE AS(
     SELECT DATEADD(HOUR, DATEDIFF(HOUR, 0, Date), 0)AS DateHour 
    , Country 
    , Count(*) OVER(Partition By Country, DATEPART(HOUR, Date))as GrpCount 
    FROM @mytable 
    WHERE date between @StartDate and @EndDate 
) 
SELECT DateHour AS Date, Country, GrpCount AS Calls 
FROM CTE 
GROUP BY Country, DateHour, GrpCount 
ORDER BY DateHour 

這是你的樣本數據:

declare @myTable table(date datetime, country varchar(20)); 
insert into @myTable values(convert(datetime,'2012-04-02 08:00:59',102),'United States'); 
insert into @myTable values(convert(datetime,'2012-04-02 08:13:42',102),'Canada'); 
insert into @myTable values(convert(datetime,'2012-04-02 08:13:56',102),'United States'); 
insert into @myTable values(convert(datetime,'2012-04-02 08:14:07',102),'Mexico'); 
insert into @myTable values(convert(datetime,'2012-04-02 08:18:09',102),'Canada'); 
insert into @myTable values(convert(datetime,'2012-04-02 08:19:50',102),'United States'); 
insert into @myTable values(convert(datetime,'2012-04-02 08:34:34',102),'Mexico'); 

Declare @StartDate datetime, @EndDate datetime; 
    set @StartDate = '20120401 00:00:00'; 
    set @EndDate = '20120430 23:59:59'; 

結果:

Date      Country   Calls 
2012-04-02 08:00:00.000 Canada   2 
2012-04-02 08:00:00.000 Mexico   2 
2012-04-02 08:00:00.000 United States  3