-2

我試圖做一個SQL,但它不工作。使用group by爲SQL來篩選日期時間

我有一個這樣的表:

接取的數量|什麼電腦有接入|什麼日期和時間

11     computer 1    2013-12-30 09:00:00 
    2     computer 2    2013-12-30 10:00:00 
    30     computer 2    2013-12-30 10:11:00 
    17     computer 3    2013-12-30 17:30:00 
    200     computer 4    2013-12-30 07:00:00 
    150     computer 1    2013-12-30 14:00:00 
    19     computer 1    2013-12-30 06:00:00 

我想提出的是一個結果,它展示給我的只有這樣的:在每一臺計算機,有多少是最大接取,什麼時候?上表中的SQL結果將如下所示:

數量|什麼電腦有接入|什麼日期和時間

30     computer 2    2013-12-30 10:11:00 
    17     computer 3    2013-12-30 17:30:00 
    200     computer 4    2013-12-30 07:00:00 
    150     computer 1    2013-12-30 14:00:00 

計算機2 exacty時間有30個接取的最大2013-12-30 10:00:00 ........

的問題是如何能我在每個結果中顯示了這個不確定的日期? 有人幫忙嗎?

感謝

+0

你可以爲此使用ROW_NUMBER。發佈一些消耗品ddl和數據,我會很高興向您展示。 sqlfiddle.com可以幫助你。 –

回答

5

我想你想要每個計算機的訪問量最大的日期?你可以在這個CTE中使用row_number。 SQL Fiddle

with CTE 
as 
(select 
accesses, 
computer, 
dt, 
row_number() over (partition by computer order by accesses desc) rn 
from 
table1 
) 

select 
* 
from 
CTE 
where 
rn = 1 
+0

如果我在訪問中使用max,該怎麼辦?我該如何分組?我認爲Norm讓我更想要的東西 – Deiwys

+0

不知道我明白。這將爲您提供每臺計算機訪問次數最多的行。據我所知,這給出了與Norm的查詢完全相同的結果,只是兩種不同的方法。 – Andrew

1

它不是很清楚哪個日期你正在尋找,但它似乎你正在尋找的最大日,由計算機進行分組,並找到了最大的效果。

select 
    max(quantity_of_access), 
    computer, 
    max(datetimecolumn) 
from 
    mytable 
group by 
    computer 
+1

OP希望每臺計算機的quantity_of_access數量最多。 –

+0

@SeanLange,感謝您的提示,我沒有立即捕獲,修復。 – paqogomez

+1

它不是固定的。不能保證兩個最大值是同一行。 –

2

像這樣。

with MySortedData as 
(
    select 
     ROW_NUMBER() over(partition by computer order by quantity_of_access desc) as RowNum 
     , quantity_of_access 
     , computer 
     , datetimecolumn 
    from 
     mytable 
) 

select * 
from MySortedData 
where RowNum = 1 
3

您可以通過使用子查詢來限制首先查找的值,然後將它們連接回主表。我根據您的信息創建了一個樣本。這適用於SQL 2005,並允許以特定日期/時間返回最大訪問次數,而不是將最大訪問次數與最大日期相結合,這可能並不總是正確的。

CREATE TABLE #Tmp(QoA INT NOT NULL, 
    Computer VARCHAR(30) NOT NULL, 
    AccDt DATETIME NOT NULL) 

    Insert into #Tmp values (11,'computer 1','2013-12-30 09:00:00') 
    Insert into #Tmp values (2,'computer 2','2013-12-30 10:00:00') 
    Insert into #Tmp values (30,'computer 2','2013-12-30 10:11:00') 
    Insert into #Tmp values (17,'computer 3','2013-12-30 17:30:00') 
    Insert into #Tmp values (200,'computer 4','2013-12-30 07:00:00') 
    Insert into #Tmp values (150,'computer 1','2013-12-30 14:00:00') 
    Insert into #Tmp values (19,'computer 1','2013-12-30 06:00:00') 

    Select * From #Tmp 

    Select m.* 
    from #Tmp m 
    Join (Select Max(QoA) 'QoA', Computer 
      from #Tmp 
      Group by Computer) l 
      on m.qoa = l.qoa and m.computer = l.computer 

    Drop table #Tmp 

結果 QoA計算機AccDt

200計算機4 2013-12-30 07:00:00.000

17計算機3 2013-12-30 17:30:00.000

30電腦2 2013-12-30 10:11:00.000

150電腦1 2013-12-30 14:00:00.000

+0

是的,你可以這樣做,但你必須現在擊中基礎表兩次,而不是一次。 –

+0

我明白這一點,但我還記得當我在查詢中使用Row_Number時,發現我們的客戶端使用的是較舊版本的SQL,並且無法在其系統上運行。 :)所以現在他有幾個替代選擇,可以工作取決於他支持的SQL實例。 – Norm

+1

@SeanLange實際上SQL Server通常在這裏執行「段頂」優化,並且只觸發一次基表。 [這裏是一個鏈接](http://sqlblog.com/blogs/paul_white/archive/2010/07/28/the-segment-top-query-optimisation.aspx)和[在SQL Server 2000上的演示](http:///dba.stackexchange.com/questions/29789/how-group-with-mindate-and-select-an-another-column-in-the-same-table/29841#29841) –