2010-08-18 41 views
2

我有一個簡單的表格 「登錄」 兩個欄目內:過濾行與DateTime值酒店僅1分鐘

  1. 用戶名(爲nvarchar)
  2. 記錄(日期時間)

這非常簡單,只需記錄有人登錄到我的Web應用程序時的用戶名和日期時間。然而,有時候,人們會在一分鐘內登錄幾次...我想嘗試運行查詢來過濾這些結果,並且只有在同一分鐘內有多個登錄才能返回一行。

下面是一個例子:

(結果我用一個簡單的選擇得到)

username logged 
------------------- 
kh0013 2010-08-16 21:29:21.020 
tmt0006 2010-08-16 21:24:16.030 
jrc0014 2010-08-16 21:17:37.187 
jrc0014 2010-08-16 21:17:15.043 
jrc0014 2010-08-16 21:17:00.593 
jrm0017 2010-08-16 20:52:57.673 
as0044 2010-08-16 20:45:51.210 
snb0006 2010-08-16 20:33:29.873 
weo0021 2010-08-16 19:54:57.093 

正如你所看到的,用戶「jrc0014」在同一分鐘內登錄多次。我怎麼可以編寫一個查詢,以便用戶只登錄一次,這樣的:

(期望的結果)

username logged 
------------------ 
kh0013 2010-08-16 21:29:21.020 
tmt0006 2010-08-16 21:24:16.030 
jrc0014 2010-08-16 21:17:00.593 
jrm0017 2010-08-16 20:52:57.673 
as0044 2010-08-16 20:45:51.210 
snb0006 2010-08-16 20:33:29.873 
weo0021 2010-08-16 19:54:57.093 
+0

您目前的選擇聲明是什麼?爲什麼只需要一條記錄即使是在一分鐘之內?將「SELECT用戶名,MAX(記錄)從登錄」是有益的? – XstreamINsanity 2010-08-18 17:44:06

回答

0

爲了讓您列出的輸出,使用方法:

SELECT yt.username , 
     MAX(yt.logged) AS logged 
    FROM YOUR_TABLE yt 
GROUP BY yt.username, DATEADD(minute,DATEDIFF(minute,0,logged),0) 
+0

感謝您的快速回復。這個查詢效果很好。我知道這不是我的問題,但下面的一些回覆給了我一個想法,即「1分鐘」可以定製。換句話說,我可以輸入一個數值來表示記錄可以彼此分開以確定是否顯示它們的秒數。在你的查詢中,它是否被硬編碼爲一分鐘? – strazz 2010-08-19 18:12:08

+0

@strazz:SQL應該被認爲是「硬編碼」 - 沒有太多支持它是「動態的」而沒有實際使用動態SQL語法。如果您想支持一分鐘以外的時間表,則必須根據所需的時間範圍對「GROUP BY」,DATEADD部分進行調整。 – 2010-08-19 18:16:23

+0

感謝您的快速回復......您介意給我一個30秒和90秒的示例修改嗎?這將幫助我充分理解查詢,並且我將很樂意前往!我也將你的帖子標記爲答案。再次感謝。 – strazz 2010-08-19 18:22:15

0

在SQL Server中,地板的日期時間精確到分鐘是這樣的:

SELECT DISTINCT 
    username , DATEADD(minute,DATEDIFF(minute,0,logged),0) AS logged 
    FROM YourTable 
0
select username, logged 
    from Logins o 
where not exists(select 1 
        from Logins i 
        where i.username = o.username 
        and datediff(second, i.logged, o.logged) <= 60) 
       ) 
+0

由於某種原因,此查詢未返回任何行。然而,OMG Ponies的上述查詢確實奏效。 – strazz 2010-08-19 18:12:40