-4

SUM(FileSize)<1000000の10行以下を選択する必要があります。結果はAttachmentIdで並べ替える必要があります。単一のFileSizeが制限を超えた場合、その行だけが選択されても(他の行は選択されなくても)問題ないとしましょう。

理想的には、これ以上ステートメントを含まない単なる選択クエリにしたいと思います。

表は次のとおりです。

CREATE TABLE [Attachment](
    [AttachmentId] [int] NOT NULL,
    [FileSize] [int] NOT NULL
)

助けてください。

更新されました。ほとんどの読者にとって要件が不明確であると聞いて申し訳ありません。グループ化を行う必要はありません。私が取得する必要があるのは、最初の10行以下の単純なものだけです。FileSizeの合計が1000000を超える場合は、10未満になります。FileSizeが1000000以上の場合は、1行のみになります。サーバーはSQL2008です。

更新されました。ニコラに感謝します。そこに到達していますが、最初の行がFileSizeの1000000を超えた場合のケースの実装方法がまだわかりません。

SELECT TOP 10 a.AttachmentId, rt.runningTotal 
FROM Attachment a
CROSS APPLY (SELECT SUM(aa.FileSize) AS runningTotal
   FROM Attachment aa
   WHERE aa.AttachmentId <= a.AttachmentId
) AS rt
GROUP BY a.AttachmentId, rt.runningTotal
HAVING rt.runningTotal < 1000000
ORDER BY a.AttachmentId  

解決策。これは私が答えとして受け入れるStuartからのコード(わずかに変更された)です。スチュアートに感謝します!:

WITH CTE
  AS ( SELECT TOP 10 AttachmentId, FileSize
, RunningID = ROW_NUMBER() OVER (ORDER BY AttachmentId)
   FROM Attachment
  )
SELECT AttachmentId, FileSize
FROM CTE AS a
WHERE (SELECT SUM(FileSize)
       FROM CTE
       WHERE RunningID <= a.RunningID
       ) <= 10000000
       OR a.RunningID = 1
4

2 に答える 2

2

多分これはあなたを始めるでしょう:

BEGIN TRAN

CREATE TABLE [Attachment]
    (
      [AttachmentId] [int] NOT NULL
    , [FileSize] [int] NOT NULL
    ) 


INSERT  INTO Attachment
        SELECT  1
              , 10
        UNION
        SELECT  2
              , 20
        UNION
        SELECT  3
              , 30

--values to exceed
DECLARE @p INT = 50

--row count to restrict to
DECLARE @r INT = 10

;
WITH    CTE
          AS ( SELECT   AttachmentID
                      , FileSize
                      , RunningID = ROW_NUMBER() OVER ( ORDER BY FileSize DESC )
               FROM     Attachment
             )
    SELECT TOP ( @r )
            AttachmentID
          , FileSize
    FROM    CTE AS A
    WHERE   ( SELECT    SUM(FileSize)
              FROM      CTE
              WHERE     RunningID <= A.RunningID
            ) <= @p 
OR A.RunningID = 1



ROLLBACK
于 2012-08-31T01:30:55.780 に答える
1
SELECT TOP 10 AttachmentId
FROM Attachment
GROUP BY AttachmentId
HAVING SUM(FileSize) < 1000000
ORDER BY AttachmentId
于 2012-08-30T08:44:48.833 に答える