如何使用sql获取相同Id编号的最小时间戳值及其对应的值

时间:2015-10-08 05:53:08

标签: sql sql-server sql-server-2008 sqlite

有人会帮我解决这个问题吗? (请参见下图)

Sample Table

enter image description here

what should be the result

enter image description here

4 个答案:

答案 0 :(得分:2)

这看起来像RANK()

的情况

见这个例子:

SELECT EmployeeCode
    , Timestamp
    , Value
FROM (
    SELECT RANK() OVER (PARTITION BY EmployeeCode ORDER BY Timestamp) AS RN
        , EmployeeCode
        , Timestamp
        , Value
    FROM dbo.SampleTable
    ) AS ST
WHERE ST.RN = 1;

它将为每一行生成一个数字(1,2,3,4 ...... n)。

请注意,我正在执行PARTITION BY,它会为每个不同的EmployeeCode重置数字。因此,此查询几乎为每个员工生成唯一编号,并且它取决于时间戳值。最低时间戳值将为1。

官方文档说

  

如果两个或更多行绑定排名,则每个绑定的行都会收到相同的排   秩。例如,如果两个顶级销售人员具有相同的SalesYTD   价值,他们都排名第一。销售人员排名第二   SalesYTD排名第三,因为有两行   排名更高。因此,RANK函数并不总是返回   连续整数。

由于您只提供了屏幕截图,我在行旁边添加了快速数字。所以你可以想象它是如何看的。

enter image description here

答案 1 :(得分:0)

试试这个:

select min(timestamp), employeeCode from table_name where employeeCode in (select employeeCode from table_name group by employeeCode)

答案 2 :(得分:0)

我认为一个基本的小组将会做到这一点:

public function defaultScope()
    {
        return array(
            'condition' => $this->getTableAlias(false, false) . '.mode = "main"',
        );
    }

答案 3 :(得分:0)

You can use Row_number() also to generate minimum result : 

SELECT EMPLOYEECODE,
       TIMESTAMP,
       VALUE
FROM  (SELECT Row_number()
                OVER (
                  PARTITION BY EMPLOYEECODE
                  ORDER BY TIMESTAMP)RN,
              EMPLOYEECODE,
              TIMESTAMP,
              VALUE
       FROM   TABLE)A
WHERE  RN = 1