SQL select与前几行上的条件

SQL select与前几行上的条件,sql,sql-server,tsql,select,Sql,Sql Server,Tsql,Select,如何编写这样的选择: 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-

如何编写这样的选择:

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 | ...
如何编写忽略第四行的SELECT?相同的文件名,相同的用户,日差<1。这实际上可能吗?

只需使用(假设您不需要数字列,因为它不在您的选择中):

如果您的
Date\u Time
列包含时间,而不仅仅是
00:00:00
,则需要去掉
DISTINCT
的时间才能正常工作:

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

以下是。

为了在一天内允许复制,我认为以下几点就足够了:

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

这将返回每天对每个文件/用户组合的第一次请求。

除非有订购,“上一次”没有任何意义。你是按日期订购的吗?编辑了一点。这就像“今天早些时候”…@Phil,它是固定的-我复制并粘贴了一点,以快速。这里有一个剥离的例子-OP还需要选择
字段1,字段2…
(从当天的“第一”行开始),所以DISTINCT不起作用。@BrankoDimitrijevic,我认为这是一个假设。OP中没有任何内容说明他需要“第一”行中的值。此外,我们不知道
field1
field2
中有哪些数据。你怎么知道它会破坏
DISTINCT
选择?@BrankoDimitrijevic实际上field1和field2是图像数据,所以它们是相同的。我怎么可能看不到我可以在这里使用DISTINCT。。?是否有一个可以同时使用distinct with DIFFER和distinct time(hh:mm)的方法呢?我会试一试,但我有一个非常大的查询,只有几个表和多个左连接:)
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
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