2

一般的なビジネス リクエストと思われるものがありますが、明確な解決策が見つかりません。失敗した基準に基づいて生成され、テーブルに保存される日次レポート (多くのレポートの中でも) があります。各レポートには、それがどのレポートであるかを示すために関連付けられたタイプ ID があり、インポートが行われた日を示すインポート イベント ID があります (明確にするために日付列が追加されています)。テーブルの基本的なスキーマを表示するために sqlfiddle を追加しました (プライバシーの問題のために名前が変更されました)。

http://www.sqlfiddle.com/#!3/81945/8

現在生成されているレポートはすべて正常に機能しているため、テーブルを変更する必要はありません。ただし、1 つのレポート (タイプ 11) では、今日表示された請求書を取得するだけでなく、その請求書の実行日からの連続した日数 (当日を含む) を合計する列を 1 つ追加する必要もあります。提供されたスキーマに基づいて、結果は次のようになります。

INVOICE     MESSAGE     EVENT_DATE      CONSECUTIVE_DAYS_ON_REPORT
12345       Yes         July, 30 2013    6
54355       Yes         July, 30 2013    2
644644      Yes         July, 30 2013    4

表示される可能性のある他のセットではなく、最新の連続した日のみが必要です。私は無駄に自己結合を実行しようとしましたが、最後の試みも sqlfiddle ファイルの一部としてリストされていますが、役に立ちませんでした。提案やアイデアはありますか?私は現時点でかなり立ち往生しています。

参考までに: 私は SQL Server 2000 で作業しています! 2005 年と 2008 年に公開された巧妙なトリックをたくさん見てきましたが、アクセスできません。

あなたの助けは大歓迎です!

4

3 に答える 3

0

このようなもの? http://www.sqlfiddle.com/#!3/81945/14

SELECT
  [final].*,
  [last].total_rows
FROM
  tblEventInfo   AS [final]
INNER JOIN
(
  SELECT
    [first_of_last].type_id,
    [first_of_last].invoice,
    MAX([all_of_last].event_date)   AS event_date,
    COUNT(*)                        AS total_rows
  FROM
  (
    SELECT
      [current].type_id,
      [current].invoice,
      MAX([current].event_date)   AS event_date
    FROM
      tblEventInfo   AS [current]
    LEFT JOIN
      tblEventInfo   AS [previous]
        ON  [previous].type_id    = [current].type_id
        AND [previous].invoice    = [current].invoice
        AND [previous].event_date = [current].event_date-1
    WHERE
          [current].type_id = 11
      AND [previous].type_id IS NULL
    GROUP BY
      [current].type_id,
      [current].invoice
  )
    AS [first_of_last]
  INNER JOIN
    tblEventInfo  AS [all_of_last]
      ON  [all_of_last].type_id     = [first_of_last].type_id
      AND [all_of_last].invoice     = [first_of_last].invoice
      AND [all_of_last].event_date >= [first_of_last].event_date
  GROUP BY
    [first_of_last].type_id,
    [first_of_last].invoice
)
  AS [last]
    ON  [last].type_id    = [final].type_id
    AND [last].invoice    = [final].invoice
    AND [last].event_date = [final].event_date

最も内側のクエリは、連続するレコードの最後のブロックの開始レコードを検索します。

次に、連続したレコードのブロック内のすべてのレコードに結合し、最終日と行数(連続した日数)を示します。

次に、最終日の行に参加してメッセージなどを取得します。


実際に に索引があることを確認してください(type_id, invoice, event_date)

于 2013-07-30T19:55:43.423 に答える