【问题标题】:How to write a query for this two tables [closed]如何为这两个表编写查询[关闭]
【发布时间】:2020-03-08 03:15:16
【问题描述】:
EMPLOYEE(id,emp_name)
1, John
2, Michael
3, Philip

====================

RANK(id,emp_id,date,rank)
1,1,1583413078445,SE
2,1,1583413087085,SSE
3,1,1583413092169,PM
4,2,1583413131802,SE
5,3,1583413536655,SE

我要展示

员工id、员工姓名和最新Rank(其id为rank表中emp_id的最大值或longdate为rank表中emp_id的最大值)

id,name,Rank
1, John, PM
2, Michael, SE
3, Philip, SE

我正在使用 java,我的数据库是 mysql 和 sqlite(以防脱机) 我尝试了一些方法,但无法聚合查询。

【问题讨论】:

  • 为什么 PM 给 John 而不是 SSE 或 SE?
  • @stickybit,因为 John (emp_id=1) 的排名表最新条目是 PM
  • 你怎么知道哪一个是最新的?你需要一个列来排序。关系数据库中的表本身没有顺序。
  • @stickybit,Rank表中有两列,emp_id为max(id),emp_id为max(longdate)
  • 到目前为止,您尝试了什么,得到了什么结果(与预期不同)?

标签: java mysql sqlite


【解决方案1】:
SELECT RK.emp_id, EP.emp_name, RK.rank
FROM RANK RK
LEFT JOIN employee EP ON RK.emp_id=EP.id
GROUP BY RK.emp_id
HAVING MAX(RK.id);

【讨论】:

  • 你能把员工作为基表,然后加入排名表吗?现在,如果员工 ID 不在等级表中,则该员工不会进入查询。
  • @AndroidWorld 使用相同的查询,但是,替换 Left Join --> Right Join,应该可以工作!
【解决方案2】:

你需要的是一些关于分析函数的技术。

with RANK_EXPAND as (
  select
    id,emp_id,date,Rank,
    max(date) over (partition by emp_id) as maxDate,
    max(id) over (partition by emp_id, date) as maxId,
  from RANK
),
select
  r.id,
  e.emp_name as name,
  r.Rank
from
  EMPLOYEE e inner join RANK_EXPAND r on e.id=r.emp_id
where
  r.date=r.maxDate and r.id=r.maxId

您也可以使用纯粹的 group by + rejoining,但这会使查询变得更长。

【讨论】:

  • 需要一个信号查询。同样使用 RANK_EXPAND,如何在 sqlite 中执行此操作。
  • 以上是单个查询...或者您的意思是您不能使用 WITH?顺便说一句,你同时标记了 mysql 和 sqlite,你使用的是哪一个?
  • @AndroidWorld 只是提醒一下,我认为只要 RANK.date 与 RANK.id 具有相同的顺序,Aditya Rewari 就可以工作。如果此假设不成立,则该答案无法满足您的“获取最大日期”要求。
  • Rank.Id 是自增主键。因此,只要 date 是较晚的一个,id 也将是较晚的。
【解决方案3】:

我同意 Aditya 的解决方案作为最佳解决方案(我会评论答案,但我没有必要的声誉)。 我只想指出另一种可能的解决方案,使用投影子句中的子查询。

SELECT EP.emp_id, EP.emp_name, 
(SELECT RK.Rank FROM Rank RK WHERE RK.emp_id=EP.emp_id ORDER BY RK.id DESC LIMIT 1) as Rank
FROM employee EP
;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 2012-01-19
    • 1970-01-01
    • 2011-09-13
    相关资源
    最近更新 更多