【问题标题】:SQL select with conditions on previous rowsSQL 选择前行的条件
【发布时间】:2012-03-15 11:57:07
【问题描述】:

这样的选择怎么写:

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?相同的文件名,相同的用户,天差

【问题讨论】:

  • "Previous" 没有意义,除非有排序。你按日期订购吗?
  • 稍微修改了一下。这就像“以前的今天”......

标签: sql sql-server tsql select


【解决方案1】:

为了在当天允许重复,我认为以下就足够了:

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

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

【讨论】:

  • 我会试一试,但我有一个很大的查询,只有很少的表和多个左连接:)
【解决方案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

【讨论】:

  • @Phil,它已修复 - 我快速复制并粘贴了一点。这是剥离的示例 - data.stackexchange.com/stackoverflow/query/64104/strip-time
  • OP 还需要选择field1, field2...(从当天的“第一”行),所以 DISTINCT 不起作用。
  • @BrankoDimitrijevic,我认为这是一个假设。 OP 中没有任何内容表明他需要“第一”行中的这些值。此外,我们不知道field1field2 中的数据是什么。你怎么知道它会破坏DISTINCT 选择?
  • @BrankoDimitrijevic 实际上 field1, field2 是图像数据,所以它们将是相同的。
  • 我怎么看不到我可以在这里使用 DISTINCT..?是否可以同时使用具有日差和显示时间 (hh:mm) 的两者?
【解决方案3】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 2017-03-30
    • 2018-03-08
    • 2011-01-24
    • 2012-07-23
    • 2014-05-22
    • 1970-01-01
    相关资源
    最近更新 更多