6

たとえば、 C列とN行のテーブルがあります。M日を含むデータ範囲でそのテーブルの「結合」を表すselectステートメントを作成したいと思います。結果の結果セットには、C + 1列(最後の列は日付)とNXM行が含まれている必要があります。

物事を明確にするための簡単な例:以下の表Aを考えます。

select * from A;
avalue  |
--------+
"a"     |

また、2012年10月の10から12までの日付範囲で、次の結果セットが必要です。

avalue  |  date
--------+-------
"a"     | 2012-10-10
"a"     | 2012-10-11
"a"     | 2012-10-12

(これは、開始値とデルタを指定して、特定の日の在庫レベルを最終的に計算するために必要な足がかりです)

4

6 に答える 6

10

これに対するPostgresの方法は単純です:CROSS JOIN関数へgenerate_series()

SELECT t.*, g.day::date
FROM   tbl t
CROSS  JOIN generate_series(timestamp '2012-10-10'
                          , timestamp '2012-10-12'
                          , interval  '1 day') AS g(day);

要求された出力を正確に生成します。

generate_series()は、派生テーブルを生成するセットを返す関数(別名「テーブル関数」)です。オーバーロードされたバリアントがいくつかあります。これが、timestamp入力を選択した理由です。

任意の日付については、式に置き換えgenerate_series()VALUESください。テーブルを永続化する必要はありません:

SELECT *
FROM   tbl t
CROSS  JOIN (
   VALUES
     (date '2012-08-13')  -- explicit type in 1st row
   , ('2012-09-05')
   , ('2012-10-10')
   ) g(day);
于 2012-10-15T16:49:11.903 に答える
2

日付テーブルに興味のある日付よりも多くの日付が含まれている場合は、

select a.avalue, b.date from a, b where b.date between '2012-10-10' and '2012-10-12'

それ以外の場合、日付テーブルに関心のある日付のみが含まれている場合、デカルト結合はこれを実現します。

select * from a,b;
于 2012-10-15T16:00:13.890 に答える
1
declare
    @Date1 datetime = '20121010',
    @Date2 datetime = '20121012';

with Dates
as
(
    select @Date1 as [Date]
    union all
    select dateadd(dd, 1, D.[Date]) as [Date]
    from Dates as D
    where D.[Date] <= DATEADD(dd, -1, @Date2)
)
select 
    A.value, D.[Date]
from Dates as D
    cross join A
于 2012-10-15T16:07:38.037 に答える
1

MySQLの場合

スキーマ/データ:

CREATE TABLE someTable
(
    someCol varchar(8) not null
);

INSERT INTO someTable VALUES ('a');

CREATE TABLE calendar
(
    calDate datetime not null,
    isBus bit
);

ALTER TABLE calendar
ADD CONSTRAINT PK_calendar
PRIMARY KEY (calDate);

INSERT INTO calendar VALUES ('2012-10-10', 1);
INSERT INTO calendar VALUES ('2012-10-11', 1);
INSERT INTO calendar VALUES ('2012-10-12', 1);

クエリ:

select s.someCol, c.calDate from someTable s, calendar c;
于 2012-10-15T16:09:08.667 に答える
1

あなたがやろうとしていることには、本当に2つの選択肢があります。

  1. RDBMSがそれをサポートしている場合(SQL Serverはサポートしていますが、他にはありません)、日付範囲を取り、その範囲内のすべての個別の日付の結果セットを返すテーブル値関数を作成できます。テーブルと関数の間でデカルト結合を行います。

  2. 日付値の静的テーブルを作成してから、2つのテーブル間でデカルト結合を実行できます。

2番目のオプションは、特に大きな日付範囲を処理している場合にパフォーマンスが向上しますが、そのソリューションでは任意の日付範囲を処理できません。ただし、最小の日付を知っておく必要があります。時間の経過とともに、いつでもテーブルに日付を追加できます。

于 2012-10-15T16:16:49.663 に答える
0

あなたのMテーブルについてはよくわかりません。日付が記載されたこのようなテーブル(M)がある場合、クロス結合を実行すると結果が表示されます。

SELECT C.*, M.date FROM C CROSS JOIN M
于 2012-10-15T16:07:43.677 に答える