【问题标题】:How to get the first and last row of data per user如何获取每个用户的第一行和最后一行数据
【发布时间】:2018-03-02 11:39:23
【问题描述】:

我正在尝试编写一个查询以仅选择每个用户的第一条和最后一条记录。

基本上我想:

SELECT * FROM EmpData WHERE ClockNo is DISTINCT AND only the first and last record
is displayed like in the picture. N.B it's color-coded per user

数据库:

CREATE TABLE [dbo].[EmpData](
[ClockNo] [nvarchar](50) NULL,
[FirstName] [nvarchar](50) NULL,
[LastName] [nvarchar](50) NULL,
[Department] [nvarchar](50) NULL,
[ClockPoint] [nvarchar](50) NULL,
[Date] [nvarchar](50) NULL,
[Time] [nvarchar](50) NULL
) ON [PRIMARY]

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: c# sql visual-studio


【解决方案1】:

有多种方法可以做到这一点。但是将日期/时间值放在两列中会使这成为一个难题。因此,大多数方法都涉及日期操作——这可能非常依赖于数据库。

这是一种不需要日期/时间操作的方法。而且,它应该在大多数具有适当索引的数据库上表现良好:

select t.*
from t
where not exists (select 1
                  from t t2
                  where t2.clockno = t.clockno and
                        (t2.date > t.date or
                         t2.date = t.date and t2.time > t.time
                        )
                  ) or
      not exists (select 1
                  from t t2
                  where t2.clockno = t.clockno and
                        (t2.date < t.date or
                         t2.date = t.date and t2.time < t.time
                        )
                  ) ;

如果您想要每天的数据,那么我会选择:

select t.*
from t join
     (select clockno, date, min(time) as mint, max(time) as maxt
      from t
      group by clockno, date
     ) tt
     on tt.clockno = t.clockno and tt.date = t.date and
        t.time in (tt.mint, tt.maxt);

【讨论】:

  • 太糟糕了,日期和时间字段是 varchar。
  • to_date(time,'hh24miss') 和 to_date(date,'YYYYMMDD') 应该可以解决这个问题
  • 它通过为每个用户提供 2 行数据来工作,但是在检查时它不需要第一次记录的时间。如何检查时间列。注意它是 nvarchar
  • @JohnaneUmslana。 . .您需要将时间转换为整数或数字。
  • 如果天数过去了,开始时间是210000,结束时间是第二天050000怎么办?
猜你喜欢
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
  • 2014-09-29
  • 1970-01-01
  • 2021-04-06
  • 2019-03-09
  • 2018-01-01
相关资源
最近更新 更多