Sql 显示最旧或最新的记录,但不显示日期
我有以下表格:Sql 显示最旧或最新的记录,但不显示日期,sql,oracle,Sql,Oracle,我有以下表格: 账户 +------------+--------------+ | account_id | account_name | +------------+--------------+ | 452 | a | | 785 | b | | 985 | c | +------------+--------------+ 我需要显示表task和account中的记录,以便只显示最
账户
+------------+--------------+
| account_id | account_name |
+------------+--------------+
| 452 | a |
| 785 | b |
| 985 | c |
+------------+--------------+
我需要显示表task
和account
中的记录,以便只显示最早的任务,而不显示日期。因此,结果将是:
+--------------+---------+
| account_name | task_id |
+--------------+---------+
| a | 2 |
| b | 7 |
| c | 4 |
+--------------+---------+
您可以简单地使用子查询:
SELECT S.ACCOUNT_NAME, S.TASK_ID FROM (
SELECT A.ACCOUNT_NAME, T.TASK_ID, MIN(T.TASK_DATE)
FROM ACCOUNT A
INNER JOIN TASK T
ON A.ACCOUNT_ID = T.ACCOUNT_ID
GROUP BY ACCOUNT_NAME, TASK_ID
) S
您可以简单地使用子查询:
SELECT S.ACCOUNT_NAME, S.TASK_ID FROM (
SELECT A.ACCOUNT_NAME, T.TASK_ID, MIN(T.TASK_DATE)
FROM ACCOUNT A
INNER JOIN TASK T
ON A.ACCOUNT_ID = T.ACCOUNT_ID
GROUP BY ACCOUNT_NAME, TASK_ID
) S
也许是这样的:
WITH CTE
AS
(
SELECT
A.ACCOUNT_NAME,
T.TASK_ID,
ROW_NUMBER() OVER(PARTITION BY T.TASK_ID
ORDER BY T.TASK_DATE DESC) AS RowNbr
FROM ACCOUNT A
INNER JOIN TASK T
ON A.ACCOUNT_ID = T.ACCOUNT_ID
)
SELECT
CTE.ACCOUNT_NAME,
CTE.TASK_ID
FROM
CTE
WHERE
CTE.RowNbr=1;
也许是这样的:
WITH CTE
AS
(
SELECT
A.ACCOUNT_NAME,
T.TASK_ID,
ROW_NUMBER() OVER(PARTITION BY T.TASK_ID
ORDER BY T.TASK_DATE DESC) AS RowNbr
FROM ACCOUNT A
INNER JOIN TASK T
ON A.ACCOUNT_ID = T.ACCOUNT_ID
)
SELECT
CTE.ACCOUNT_NAME,
CTE.TASK_ID
FROM
CTE
WHERE
CTE.RowNbr=1;
您可以使用分析:
SELECT account_name, task_id
FROM (SELECT a.account_name,
t.task_id,
row_number()
over(PARTITION BY a.account_id ORDER BY t.task_date) task_num
FROM account a
INNER JOIN task t ON a.account_id = t.account_id
GROUP BY account_name, task_id)
WHERE task_num = 1
或自联接:
SELECT a.account_name, t.task_id
FROM account a
INNER JOIN task t ON a.account_id = t.account_id
WHERE (t.account_id, t.task_date) = (SELECT t_in.account_id,
MIN(t_in.task_date)
FROM task t_in
GROUP BY t_in.account_id)
您可以使用分析:
SELECT account_name, task_id
FROM (SELECT a.account_name,
t.task_id,
row_number()
over(PARTITION BY a.account_id ORDER BY t.task_date) task_num
FROM account a
INNER JOIN task t ON a.account_id = t.account_id
GROUP BY account_name, task_id)
WHERE task_num = 1
或自联接:
SELECT a.account_name, t.task_id
FROM account a
INNER JOIN task t ON a.account_id = t.account_id
WHERE (t.account_id, t.task_date) = (SELECT t_in.account_id,
MIN(t_in.task_date)
FROM task t_in
GROUP BY t_in.account_id)
您可以使用以下简单方法:
SELECT a.account_name, t.task_id
FROM account a,
task t
WHERE a.account_id= t.account_id
AND t.task_date in (SELECT MIN(t.task_date))
GROUP BY account_name, task_id;
您可以使用以下简单方法:
SELECT a.account_name, t.task_id
FROM account a,
task t
WHERE a.account_id= t.account_id
AND t.task_date in (SELECT MIN(t.task_date))
GROUP BY account_name, task_id;
另一种方法,稍微短一点:
select max(a.accountname) as account_name
, max(t.taskid) keep(dense_rank first
order by t.taskdate) as task_id
from account1 a
join task t
on (a.accountid = t.accountid)
group by a.accountid
结果:
ACCOUNT_NAME TASK_ID
------------ ----------
a 2
b 7
c 4
另一种方法,稍微短一点:
select max(a.accountname) as account_name
, max(t.taskid) keep(dense_rank first
order by t.taskdate) as task_id
from account1 a
join task t
on (a.accountid = t.accountid)
group by a.accountid
结果:
ACCOUNT_NAME TASK_ID
------------ ----------
a 2
b 7
c 4
这比看起来容易:在正常连接表之后,只需按max(tak_date)进行过滤,您可以通过简单的子选择进行计算
SELECT acc.account_name, tsk.task_id
FROM account acc
JOIN task tsk on (acc.account_id = tsk.account_id)
WHERE tsk.task_date = (
SELECT MAX(aux.task_date)
FROM task aux
WHERE aux.account_id = tsk.account_id
)
这比看起来更容易:在正常连接表之后,只需按max(tak_date)进行过滤,您可以通过简单的子选择进行计算
SELECT acc.account_name, tsk.task_id
FROM account acc
JOIN task tsk on (acc.account_id = tsk.account_id)
WHERE tsk.task_date = (
SELECT MAX(aux.task_date)
FROM task aux
WHERE aux.account_id = tsk.account_id
)
SELECT MIN(t.task\u date)
不是有效的Oracle SELECT语句。与MS SQL Server不同,在Oracle中,您总是必须从某处进行选择,这意味着FROM
子句是必需的。@NicholasKrasnov我是用mysql在头脑中编写查询的。但是如果您愿意,您可以在子查询中包含“FROM task”。select MIN(t.task\u date)
不是有效的Oracle select语句。与MS SQL Server不同,在Oracle中,您总是必须从某个地方进行选择,这意味着FROM
子句是必需的。@NicholasKrasnov我是用mysql在头脑中编写查询的。但是如果您愿意,可以在子查询中包含“FROM task”。我尝试了自连接,效果非常好。除了简单之外。ThanksI尝试了自连接,效果非常好。除了简单之外。谢谢