1

次のテーブルがあります。

account

+------------+--------------+
| | アカウント ID | アカウント名 |
+------------+--------------+
| | 452 | | |
| | 785 | b |
| | 985 | c |
+------------+--------------+

task

+---------+------------+------------+
| | タスク ID | タスク日付 | アカウント ID |
+---------+------------+------------+
| | 2 | 2013 年 1 月 1 日 | 452 |
| | 1 | 2013 年 2 月 14 日 | 452 |
| | 5 | 2013 年 3 月 1 日 | 452 |
| | 1 | 2013 年 2 月 2 日 | 785 |
| | 7 | 2013 年 7 月 1 日 | 785 |
| | 5 | 2013 年 1 月 3 日 | 785 |
| | 1 | 2013 年 3 月 25 日 | 985 |
| | 4 | 2013 年 3 月 22 日 | 985 |
+---------+------------+------------+

taskテーブルからレコードを表示する必要がありaccount、日付を表示せずに最も古いタスクのみを表示できるようにする必要があります。したがって、結果は次のようになります。

+--------------------+---------+
| | アカウント名 | タスク ID |
+--------------------+---------+
| | | | 2 |
| | b | 7 |
| | c | 4 |
+--------------------+---------+

min関数の使用が頭に浮かびました。しかし、日付を表示したくないので、どうすれば関数を使用できますか。

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
4

6 に答える 6

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;
于 2013-10-22T09:59:12.343 に答える
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)
于 2013-10-22T09:59:21.880 に答える
1

サブクエリを簡単に使用できます。

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
于 2013-10-22T09:57:48.977 に答える
1

この単純なアプローチを使用できます。

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;
于 2013-10-22T10:06:37.463 に答える