2012-03-15 45 views
2

有條件選擇如何寫這樣的選擇:SQL以前行

SELECT filename, username, date_time, field1, field2... FROM... JOIN... WHERE... 
UNLESS user_downloaded_this_file_today_already 

我想忽略在同一天的同一用戶下載的文件。數據示例:

12 | file1.jpg | barney | 2012-03-15 12:50:10 | ... 
13 | file1.jpg | roger | 2012-03-15 13:50:10 | ... 
14 | file2.jpg | barney | 2012-03-15 14:50:10 | ... 
15 | file1.jpg | barney | 2012-03-15 15:50:10 | ... 

如何編寫會忽略第4行的SELECT?相同的文件名,相同的用戶,日差< 1.這實際上是可能的嗎?

+0

除非訂購,否則「Previous」沒有任何意義。你按日期訂購嗎? – 2012-03-15 11:59:18

+0

編輯一下。這就像「以前這一天」... – yosh 2012-03-15 12:01:32

回答

2

只需使用SELECT DISTINCT(假設你不需要的數字列,因爲它不是在你的選擇):

SELECT DISTINCT FileName, 
       UserName, 
       Date_Time 
FROM    [YourTable] 

如果您Date_Time列包含時間並不僅僅是00:00:00,你需要去掉對於DISTINCT的時間才能正常工作:

SELECT DISTINCT FileName, 
       UserName, 
       CONVERT(DATETIME, FLOOR(CONVERT(FLOAT, Date_Time))) AS Date_Time 
FROM    [YourTable] 

這裏的an example of the date stripping in action

+0

如果這個工作正常,你需要一個CONVERT(Date,Date_Time)。 – Phil 2012-03-15 12:04:39

+0

@菲爾,它是固定的 - 我複製並粘貼了一下快。下面是一個剝離示例 - http://data.stackexchange.com/stackoverflow/query/64104/strip-time – 2012-03-15 12:05:23

+0

OP還需要選擇「field1,field2 ...」(從第一行到第一天),所以DISTINCT將無法工作。 – 2012-03-15 12:13:11

1
SELECT filename, username, date_time, field1, field2 
FROM (
    SELECT filename, username, date_time, field1, field2, 
    ROW_NUMBER() OVER (ORDER BY username,filename, CONVERT(date,date_time)) AS RN, 
    RANK() OVER (ORDER BY username,filename, CONVERT(date,date_time)) AS R 

    FROM [table] 
) A 
WHERE A.RN = A.R 
4

爲了能夠在一天的重複,我覺得有以下就足夠了:

select filename, username, date_time, field1, field2 
    from yourtable t 
where not exists (
    select 1 
     from yourtable 
    where t.filename = filename 
     and t.username = username 
     and trunc(t.date_time) = trunc(date_time) 
     and t.date_time > date_time) 
order by t.date_time 

這將返回每天每個文件/用戶組合的第一要求。

+0

我會給它一個鏡頭,但我有一個很大的查詢與幾個表和多個左連接:) – yosh 2012-03-15 15:06:59