Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 显示最旧或最新的记录,但不显示日期_Sql_Oracle - Fatal编程技术网

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尝试了自连接,效果非常好。除了简单之外。谢谢