2

2012 年 10 月 1 日以降、1 日あたり 50 個のランダムなファイルを選択しようとしています。例:

  • 10 月 1 日 = 50 ファイル
  • 10 月 2 日 = 50 ファイル
  • 10 月 3 日 = 50 ファイル
  • など……今日

これまでのところ、1 日に 1 つのファイルを選択できますが、50 個必要です。ランダムにする必要がありました

DECLARE @DaysBack AS INT
SET @DaysBack = -25


    SET NOCOUNT ON;

    SELECT FileDate, MAX(FileName)  FROM (
    SELECT 
    CONVERT(VARCHAR(10),DATEADD(second,actiondate, CAST('1970-01-01 00:00:00' AS datetime)), 101) AS FileDate

    ,'\\directory\' + filename AS FileName
    FROM   Tableq q
    JOIN tablec c
    on  q.projectid = c.projectid
           AND actiondate >= Datediff(s, '19700101 00:00:00:000',
                             Dateadd(DAY, @DaysBack, Getutcdate()))


    ) x

    GROUP BY FileDate
    ORDER  BY FileDate 
4

3 に答える 3

4

現在、SQL Serverインスタンス(またはSQL Fiddle)にアクセスできません。しかし、これはactiondateごとにランダムなIDを与えるはずです...

  • ROW_NUMBER() OVER (PARTITION BY actiondate ORDER BY NEWID())

これは、以下がアクション日付ごとにランダムに50アイテムを選択することを意味します...

DECLARE @DaysBack AS INT
SET @DaysBack = -25

SET NOCOUNT ON;

SELECT
  FileDate, FileName
FROM
(
  SELECT 
    DATEADD(DAY, actiondate / 86400, '19700101') AS FileDate,
    '\\\\directory\\' + filename AS FileName,
    ROW_NUMBER() OVER (PARTITION BY actiondate / 86400 ORDER BY NEWID()) AS random_daily_id
FROM
  Tableq q
JOIN
  tablec c
    ON  q.projectid = c.projectid
    AND actiondate >= Datediff(s, '19700101', Dateadd(DAY, @DaysBack, Getutcdate()))
) x
WHERE
  random_daily_id <= 50
ORDER BY
  FileDate 
于 2012-10-25T13:33:02.963 に答える
0

SQL Server 2005 以降を使用していると仮定すると、ランキング関数を使用してこれを行うことができます。

SELECT FileDate, MAX(FileName)
FROM (select x.*,
             ROW_NUMBER() over (partition by FileDate order by newid()) as seqnum
      from (SELECT CONVERT(VARCHAR(10),DATEADD(second,actiondate, CAST('1970-01-01 00:00:00' AS datetime)), 101
                          ) AS FileDate,
                   '\\directory\' + filename AS FileName
            FROM   Tableq q JOIN
                   tablec c
                   on  q.projectid = c.projectid and
                       actiondate >= Datediff(s, '19700101 00:00:00:000',
                                     Dateadd(DAY, @DaysBack, Getutcdate()))
           ) x
     ) x
where seqnum <= 50
ORDER  BY FileDate

これはrow_number()、ランダムに割り当てられた番号で、各日付のファイルにシーケンス番号を追加するために使用します。次に、各日付の上位 50 件を選択します。

于 2012-10-25T13:34:27.810 に答える
0

ランダム抽出データベース側を実装しないことを強くお勧めします。プロジェクトで同様の要件がありましたが、最終的にランダム化ロジックをビジネス側に移しました。

于 2012-10-25T13:35:35.533 に答える