2017-12-14 6 views
2

何を検索するのか不明なので、ご意見をいただければ幸いです。私は私の結果は、唯一のトランザクションは同じ日付が、のような一日の異なる時間が、あるレコードを表示するように設定したい1日で複数のトランザクションを実行するSQL ID

AccountID UpdatedDate 
123  11/1/2017 08:00:00:000 
123  11/1/2017 20:00:00:000 
123  11/2/2017 08:00:00:000 

456  11/1/2017 08:00:00:000 
456  11/1/2017 14:00:00:000 
456  11/1/2017 20:00:00:000 

789  11/1/2017 08:00:00:000 
789  11/2/2017 08:00:00:000 

は、私は、SQL Serverの次のような構造を持つテーブルを持っています:

AccountID UpdatedDate 
123  11/1/2017 08:00:00:000 
123  11/1/2017 20:00:00:000 

456  11/1/2017 08:00:00:000 
456  11/1/2017 14:00:00:000 
456  11/1/2017 20:00:00:000 

私は多くの運がありません。苦労している初心者のための助けは素晴らしいでしょう、ありがとうございます!

+0

こんにちは、私はみんなの入力を感謝しています。私はおそらく明確化する必要があります。これは単なるデータセットの例です。私は何千もの行のデータを持っており、この基準を満たすものを抜き出したいと思っています。この例では、私の例を挿入した一時テーブルがうまくいくかどうか分かりません。お知らせ下さい。 –

+0

特定のニーズを満たすためにこれを実装できるはずです。 2つの列がある場合は、ソリューションでAccountIDとUpdatedDateを置き換えて、望ましい結果を得ることができます。 @testTableから選択するのではなく、カラムが格納されているテーブルから必要なカラムを選択します。 – Rooben

答えて

1

これは最も洗練されたソリューションではありませんが、必要な結果が得られます。

DECLARE @testTable TABLE (AccountID INT, UpdatedDate DATETIME) 

INSERT INTO @testTable 
VALUES ('123', '11/1/2017 08:00:00:000'), 
     ('123', '11/1/2017 20:00:00:000'), 
     ('123', '11/2/2017 08:00:00:000'), 
     ('456', '11/1/2017 08:00:00:000'), 
     ('456', '11/1/2017 14:00:00:000'), 
     ('456', '11/1/2017 20:00:00:000'), 
     ('789', '11/1/2017 08:00:00:000'), 
     ('789', '11/2/2017 08:00:00:000'); 

WITH accounts 
AS (
    SELECT rowid = ROW_NUMBER() OVER (
      PARTITION BY AccountID, cast(UpdatedDate AS DATE) ORDER BY UpdatedDate 
      ), AccountID, UpdatedDate, [day] = cast(UpdatedDate AS DATE), [time] = cast(UpdatedDate AS TIME(0)) 
    FROM @testTable 
    ) 
SELECT DISTINCT ch.AccountID, ch.UpdatedDate 
FROM (
    SELECT accounts.day, accounts.AccountID 
    FROM accounts 
    WHERE rowid > 1 
    ) c 
INNER JOIN accounts ch ON ch.day = c.day 
    AND c.AccountID = ch.AccountID 
1

サンプルデータありがとうございます。 2 CTEのいえにはNED:

DECLARE @testTable TABLE (AccountID INT, UpdatedDate DATETIME) 

INSERT INTO @testTable 
VALUES ('123', '11/1/2017 08:00:00:000'), 
     ('123', '11/1/2017 20:00:00:000'), 
     ('123', '11/2/2017 08:00:00:000'), 
     ('456', '11/1/2017 08:00:00:000'), 
     ('456', '11/1/2017 14:00:00:000'), 
     ('456', '11/1/2017 20:00:00:000'), 
     ('789', '11/1/2017 08:00:00:000'), 
     ('789', '11/2/2017 08:00:00:000'); 

WITH Counts AS (
    SELECT *, 
      COUNT(*) OVER (PARTITION BY AccountID, CONVERT(date,UpdatedDate)) AS C 
    FROM @testTable) 
SELECT AccountID, 
     UpdatedDate 
FROM Counts 
WHERE C > 1; 
0

この

DECLARE @T TABLE 
(
    AccountId INT, 
    UpdateDate DATETIME 
) 

INSERT INTO @T 
VALUES 
(123,'11/1/2017 08:00:00:000'), 
(123,'11/1/2017 20:00:00:000'), 
(123,'11/2/2017 08:00:00:000'), 
(456,'11/1/2017 08:00:00:000'), 
(456,'11/1/2017 14:00:00:000'), 
(456,'11/1/2017 20:00:00:000'), 
(789,'11/1/2017 08:00:00:000'), 
(789,'11/2/2017 08:00:00:000') 

;WITH CTE 
AS 
(
    SELECT 
     SeqNo = ROW_NUMBER() OVER(PARTITION BY AccountId,CAST(UpdateDate AS DATE) ORDER BY UpdateDate), 
     * 
     FROM @T 
) 
SELECT 
    * 
    FROM CTE C1  
    WHERE EXISTS 
     (
      SELECT 1 FROM CTE WHERE AccountId = C1.AccountId AND SeqNo > 1 AND CAST(UpdateDate AS DATE) = CAST(c1.UpdateDate AS DATE) 
     ) 
0

別のオプションを試してみては、アカウントIDのセットを取得するために使用group byhavingを行う日付のペアと、そのセットに対してフィルタリングすることではありません。

DECLARE @testTable TABLE(アカウントID INT、UpdatedDate DATETIME)

INSERT INTO @testTable 
VALUES ('123', '11/1/2017 08:00:00:000'), 
     ('123', '11/1/2017 20:00:00:000'), 
     ('123', '11/2/2017 08:00:00:000'), 
     ('456', '11/1/2017 08:00:00:000'), 
     ('456', '11/1/2017 14:00:00:000'), 
     ('456', '11/1/2017 20:00:00:000'), 
     ('789', '11/1/2017 08:00:00:000'), 
     ('789', '11/2/2017 08:00:00:000'); 

WITH grouped AS (SELECT AccountID 
     , CAST(UpdatedDate AS DATE) AS UpdatedDateOnly 
    FROM @testTable 
    GROUP BY AccountID, CAST(UpdatedDate AS DATE) 
    HAVING COUNT(*) > 1) 
SELECT tt.* 
FROM @testTable tt 
INNER JOIN grouped g 
    ON g.AccountID = tt.AccountID 
    AND g.UpdatedDateOnly <= tt.UpdatedDate 
     AND tt.UpdatedDate < DATEADD(DAY, 1, g.UpdatedDateOnly); 
関連する問題