2012-03-15 43 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