0

SQL Server 2008 r2 を使用しています。これが私のクエリです。

    SELECT  TOP 25 A.*, U.Displayname AS UserName,
            SU.Displayname AS SmoothieAuthorName, 
            S.Name AS SmoothieName, S.Id AS SmoothieId
    FROM    dbo.Activity AS A 
            LEFT JOIN dbo.[User] AS U ON A.UserId = U.Id
            LEFT JOIN dbo.[User] AS SU ON A.SmoothieAuthorId = SU.Id
            LEFT JOIN dbo.Smoothie AS S ON A.SmoothieId = S.Id

    WHERE   A.UserId = 2 --@UserId
            AND A.UserId <> A.SmoothieAuthorId
    ORDER BY CreatedDate DESC

以下は私の結果です。ここで、SmoothieId と CreatedDate でグループ化する必要があります (日付部分のみをグループ化し、時間を無視します)。最初の 2 つは 1 つだけ返され、3 ~ 5 は 1 つだけ返されます。やり方がわからないので、助けてください。

Id  ActionType  UserId  SmoothieId  SmoothieAuthorId    CreatedDate             UserName    SmoothieAuthorName  SmoothieName    SmoothieId
1   view        2       128         1                   2013-01-15 20:05:03.403 mike        test1234            new testing 2d  128
2   view        2       128         1                   2013-01-15 20:16:24.733 mike        test1234            new testing 2d  128
12  view        2       128         1                   2013-01-16 21:45:56.167 mike        test1234            new testing 2d  128
13  view        2       128         1                   2013-01-16 22:12:51.217 mike        test1234            new testing 2d  128
14  view        2       128         1                   2013-01-16 22:12:54.407 mike        test1234            new testing 2d  128
15  view        2       69          1                   2013-01-16 22:19:54.783 mike        test1234            sdfsdfwww       69
4

2 に答える 2

1

Id を含む A のすべての列が必要な場合は、Id を含めるのに苦労すると思います。A の列を明示的にリストする必要があると思います。また、グループ化するレコードの数が必要であると想定したため、Count(TheDate) 要素が必要です。

それ以外は、datetimeの日付部分だけを取得し、その上でグループ化することを検討してください。

何かのようなもの;

SELECT ActionType, UserId, SmoothieId, SmoothieAuthorId,
       TheDate, Count(TheDate) AS Occurances, UserName, SmoothieAuthorName, 
       SmoothieName, SmoothieId
  FROM (
    SELECT  TOP 25 A.ActionType, A.UserId, A.SmoothieId,  
            A.SmoothieAuthorId, 
            DATEADD(dd, 0, DATEDIFF(dd, 0, CreatedDate)) AS TheDate, 
            U.Displayname AS UserName,
            SU.Displayname AS SmoothieAuthorName, 
            S.Name AS SmoothieName, S.Id AS SmoothieId
    FROM    dbo.Activity AS A 
            LEFT JOIN dbo.[User] AS U ON A.UserId = U.Id
            LEFT JOIN dbo.[User] AS SU ON A.SmoothieAuthorId = SU.Id
            LEFT JOIN dbo.Smoothie AS S ON A.SmoothieId = S.Id
    WHERE   A.UserId = 2 --@UserId
            AND A.UserId <> A.SmoothieAuthorId
    -- ORDER BY CreatedDate DESC
) x GROUP BY ActionType, UserId, SmoothieId, SmoothieAuthorId, UserName, 
             TheDate, SmoothieAuthorName, SmoothieName, SmoothieId
    ORDER BY The Date DESC

注:これはテストされていません。私が試してみたいことを簡単に提案しただけです。

于 2013-01-17T04:57:39.997 に答える
0

質問を完全に理解しているかどうかはわかりません。これらの列に個別の値が必要であると仮定すると、次のように使用できますDISTINCT

SELECT DISTINCT 
    CAST(CreatedDate to Date) as DateWanted, 
    SmoothieId  
FROM 
(    
    SELECT  TOP 25 A.*, U.Displayname AS UserName,
            SU.Displayname AS SmoothieAuthorName, 
            S.Name AS SmoothieName, S.Id AS SmoothieId
    FROM    dbo.Activity AS A 
            LEFT JOIN dbo.[User] AS U ON A.UserId = U.Id
            LEFT JOIN dbo.[User] AS SU ON A.SmoothieAuthorId = SU.Id
            LEFT JOIN dbo.Smoothie AS S ON A.SmoothieId = S.Id
    WHERE   A.UserId = 2 --@UserId
            AND A.UserId <> A.SmoothieAuthorId
) t 

あなたのコメントを確認すると、Activity テーブルのすべてのフィールドが必要だとおっしゃいました。最初の 2 つのレコード (1 または 2) の Id 列に何が表示されると予想されますか? 他の列の値はすべて同じですか? 1 つのレコードだけを取得するには、1 つの行を他の行から選択するか、同じ情報を持つ列でグループ化する必要があります。

幸運を。

于 2013-01-17T04:34:04.287 に答える