我正在尝试撰写查询 从下面的条目表中,我想为每个用户返回一行。返回的行包括来自计算机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
答案 0 :(得分:3)
我看到你把这个标记为hana。我猜你还没有多少与关系数据库合作。
关系数据库对数据集进行操作。行级或记录级处理效率低下。所以这里的诀窍是考虑两组不同的数据。
您首先需要生成一个基于数据的子集,列出计算机上用户的最早条目。这是您在日期和用户和计算机上分组使用聚合函数(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)