SQLの質問:レコードからレコードへのDateDiff関数に基づいて取得するレコードの

StackOverflow https://stackoverflow.com/questions/1134272

  •  16-09-2019
  •  | 
  •  

質問

[OK]を、ここではトリッキーな1つを得た...私のデータは次のようになります場合:

表1

ID  Date_Created 
1   1/1/2009
2   1/3/2009
3   1/5/2009
4   1/10/2009
5   1/15/2009
6   1/16/2009

はどのように互いに離れて2日間のレコードを得るのですか?私の最終的な結果セットは、行1-3、5-6でなければなりません。ありがとう!

役に立ちましたか?

解決

select distinct t1.*
from Table1 t1
inner join Table1 t2 
    on abs(cast(t1.Date_Created - t2.Date_Created as float)) between 1 and 2

他のヒント

SELECT l.*
FROM Table1 l
INNER JOIN Table1 r ON DATEDIFF(d, l.Date_Created, r.Date_Created) = 2
      AND r.Date_Created = (SELECT TOP 1 * FROM Table1 WHERE Date_Created > l.Date_Created ORDER BY Date_Create)

- ?何これはあなたを与えるん。

DISTINCT TABLE1のT1からt2.date_created t1.date_created t1.id、t2.id、TABLE1のDATEDIFF(ddは、t1.date_created、t2.date_created)T2 = 2を選択し、t1.id!= t2.id t1.id BY ORDER;

この作品は、でしょうか?

select t1.id, t2.id 
  from table1 t1 
  join table1 t2 
    on t2.date_created - t1.date_created <= 2

私はそれを行うにはプログラミングコードを使用することをお勧めかもしれません。あなたは、行(別のグループ)のグループを集めたいです。私はあなたがこれは(あなたの背中行のちょうど1セットを与えるだろう)単一のクエリを使用して解決することができないと思います。

あなたは離れて「N」日以内にある行を取得したい場合、あなたはこれを試すことができます:

select t1.date_created, t2.date_created 
from table1 t1, table1 t2 
where t1.id <> t2.id and 
      t2.date_created-t1.date_created between 0 and N;

exmapleため、あなたが言ったように、あなたは2日一部内にある行を取得したい場合は、 あなたは以下を使用することができます:

select t1.date_created,t2.date_created 
from table1 t1, table1.t2 
where t1.id <> t2.id and 
      t2.date_created-t1.date_created between 0 and 2;

私はこれが役に立てば幸い....

よろしく、 Srikrishnaます。

カーソルが最速になりますが、ここでそれを行いますSELECTクエリがあります。 「Nまでの」日おきの代わりに、2のためにあなたは0からN-1までの整数のテーブルとテーブル二つを交換する必要があります(と効率が悪くなる)ことに注意してください。

私はそれはあなたが望むものを完全には明らかではありません認めるよ、私はよあなたがすべてで、少なくとも2つの行を含む行の範囲をしたいと思いますし、その中で連続する行が離れ、せいぜい2日です。日付がIDに沿って増加した場合は、この作業をする必要があります。

with Two as (
  select 0 as offset union all select 1 
), r2(ID, Date_Created_o, dr) as (
  select
    ID, Date_Created+offset,
    Date_Created + offset - dense_rank() over (
      order by Date_Created+offset
    ) from r cross join Two
)
  select
    min(ID) as start, max(ID) as finish
  from r2
  group by dr
  having min(ID) < max(ID)
  order by dr;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top