5

約 15 列の各メンバーが投稿したタスクを取得するために、5 つのテーブルを結合しています。しかし、サンプル コードでは、それらのテーブルを 2 つだけ取りました。

SELECT TOP 5 
    dbo.MemberMst.MemberID, dbo.MemberMst.fname, 
    dbo.TaskMst.TaskMstID, dbo.TaskMst.OnDate, dbo.TaskMst.Description
FROM   
    dbo.MemberMst 
LEFT JOIN
    dbo.TaskMst ON dbo.MemberMst.MemberID = dbo.TaskMst.MemberID

出力は次のとおりです。

MemberID fname  TaskMstID    OnDate                   Description
3    Ursula     NULL         NULL                      NULL
84   Opeyemi    30           2012-09-18 00:00:00.000     asd
85   test       21           2012-09-18 10:30:46.900     aaa
85   test       22           2012-09-18 10:31:04.967     eeee
85   test       23           2012-09-18 10:31:26.640     vvvv

上記のクエリでは、3つのMemberID=85タスクを投稿したユーザーに対して 3 つの行を取得しますが、そのメンバーから最新のタスクを 1 つだけ必要とします。結果が次のようになるように、メンバーによって投稿された最新のタスクを取得する方法:-

MemberID fname  TaskMstID OnDate                Description
3    Ursula     NULL      NULL                   NULL
84   Opeyemi    30        2012-09-18 00:00:00.000   asd
85   test       23        2012-09-18 10:31:26.640   vvvv

memberIDそれぞれのタスクに対して 1 つのレコードのみということですか?

助けていただければ幸いです..!

前もって感謝します...!

4

4 に答える 4

4

Since you are using SQL Server 2008, you can take advantage of Window Functions.

Try something like this:

SELECT  c.MemberID, c.fname, c.TaskMstID, c.OnDate, c.Description
FROM
    (
        SELECT  a.MemberID, a.fname,
                b.TaskMstID, b.OnDate, b.Description,
                ROW_NUMBER() OVER (Partition BY a.MemberID ORDER BY b.OnDate DESC) RN
        FROM    MemberMst a
                LEFT JOIN TaskMst b
                    ON a.MemberID = b.MemberID
    ) c
WHERE c.RN = 1
于 2012-09-28T06:09:04.923 に答える
3
;With Cte1  AS
(

SELECT  top 5 dbo.MemberMst.MemberID, dbo.MemberMst.fname, dbo.TaskMst.TaskMstID, dbo.TaskMst.OnDate, dbo.TaskMst.Description
FROM   dbo.MemberMst left JOIN
dbo.TaskMst ON dbo.MemberMst.MemberID = dbo.TaskMst.MemberID
),
Cte2 As
(   SELECT Rn = Row_Number() Over(Partition by MemberId Order By OnDate Desc), *
    From Cte1

)
Select * 
From Cte2 
Where Rn = 1

あなたのためにタスクを実行する必要があります。やってみて。

于 2012-09-28T06:10:35.857 に答える
1

MAX() 関数でGroup BY()句を使用するだけです

with CTE as(
    SELECT TOP 5 
        dbo.MemberMst.MemberID, 
        dbo.MemberMst.fname, 
        dbo.TaskMst.TaskMstID, 
        dbo.TaskMst.OnDate, 
        dbo.TaskMst.Description
    FROM
        dbo.MemberMst left 
        JOIN dbo.TaskMst 
        ON dbo.MemberMst.MemberID = dbo.TaskMst.MemberID)

select dbo.MemberMst.MemberID, 
        dbo.MemberMst.fname, 
        dbo.TaskMst.TaskMstID, 
        max(dbo.TaskMst.OnDate) as OnDate, 
        dbo.TaskMst.Description
from CTE
group by MemberID
于 2012-09-28T06:07:51.813 に答える
1

MemberID で分割し、Rank を取得して、上位にランク付けされた項目のみを選択できます。

MSDNの詳細情報

このようなことを試してください

WITH MyCte AS 
(SELECT  top 5 dbo.MemberMst.MemberID, dbo.MemberMst.fname, dbo.TaskMst.TaskMstID, dbo.TaskMst.OnDate, dbo.TaskMst.Description,
        ROW_NUMBER() OVER (PARTITION BY dbo.MemberMst.MemberID ORDER BY dbo.TaskMst.OnDate DESC) AS RowNum 
FROM   dbo.MemberMst 
left JOIN dbo.TaskMst ON dbo.MemberMst.MemberID = dbo.TaskMst.MemberID)
SELECT  *
FROM    MyCte
WHERE   RowNum > 0

更新: RANK() の代わりに ROW_NUMBER() に変更して、同じランクの複数の行の問題を回避しました。

于 2012-09-28T06:22:06.657 に答える