如何获得每个用户的第一个条目,包括条目ID

时间:2014-11-19 20:58:42

标签: sql hana

我正在尝试撰写查询 从下面的条目表中,我想为每个用户返回一行。返回的行包括来自计算机1和计算机2的条目。返回的行应具有最低日期。结果按日期排序asc。


条目: | EntryID | UserID | Date | Value | ComputerID | |---------|---------|------------|--------------|------------| | 1 | 21 | 01/03/2013 | Login | 3 | | 2 | 22 | 01/04/2013 | Login | 1 | | 3 | 21 | 01/05/2013 | Edit | 3 | | 4 | 20 | 01/06/2013 | Login | 2 | | 5 | 20 | 01/07/2013 | Search | 2 | | 6 | 22 | 01/08/2013 | Login | 4 | | 7 | 21 | 01/09/2013 | Close | 3 | | 8 | 21 | 01/11/2013 | Login | 1 | | 9 | 20 | 01/12/2013 | Edit | 2 | | 10 | 22 | 01/13/2013 | Search | 1 |

这是我试图写的查询的理想结果: |Userid | First Log Date | EntryID | ComputerID | |-------|----------------|---------|------------| | 22 | 01/04/2013 | 2 | 1 | | 20 | 01/06/2013 | 4 | 2 | | 21 | 01/11/2013 | 8 | 1 |

编辑:我已经尝试了以下但我无法获得正确的EntryID:

SELECT max(userID) as user, 
min(date) as date, 
max(entryID) as entryID, 
max(computerID) as computerID 
From Entry where computerID in ('1', '2') group by userID order by date ASC

2 个答案:

答案 0 :(得分:3)

我看到你把这个标记为hana。我猜你还没有多少与关系数据库合作。

关系数据库对数据集进行操作。行级或记录级处理效率低下。所以这里的诀窍是考虑两组不同的数据。

  • 包含用户和的最早条目(集合2的子集)的1个集合 电脑
  • 包含所有记录的2套

您首先需要生成一个基于数据的子集,列出计算机上用户的最早条目。这是您在日期和用户和计算机上分组使用聚合函数(min)的地方。

然后将其连接回基本集,将列表限制为每台用户对计算机的最早访问权限。

因此:

SELECT A.UserID, A.Date as FirstLogDate, A.EntryID, A.ComputerID
FROM entries A
INNER JOIN (SELECT min(Date) mDate, UserID, ComputerID 
            FROM entries 
            GROUP BY userID, computerID) B
 on A.Date = B.mDate
 and A.userID = B.UserID
 and A.computerID=B.ComputerID
WHERE A.ComputerID in (1,2)

您可以将where子句放在子查询中,您可以获得一些效率提升,因为系统会在连接之前限制数据。

答案 1 :(得分:0)

您可以按最小日期过滤,从子查询中获取它。此子查询本身由主查询过滤(在本例中为Userid)。像这样:

select 
    Userid, Date as FirstLogDate, EntryID, ComputerID
from
    Entries as A
where 
    ComputerID in (1, 2)
    and Date =
        (select
            min(date)
        from
            Entries
        where
            Userid = A.Userid)