2016-03-26 14 views
0

私は、タイムスタンプとティックデータを含むsqliteデータベースを持っています。タイムスタンプには日付と時刻が含まれています。 '終わりの日'の分析のために、同じ日付のタイムスタンプの重複を除外したいと思います。重複している日付のデータベース行が選択されているかどうかは関係ありません。sqliteテーブル選択のタイムスタンプから日の重複を無視する

表は次のようになります。

CREATE TABLE StockQuotes 
    (`Timestamps` varchar(19), `Open` float) 
; 

INSERT INTO StockQuotes 
    (`Timestamps`, `Open`) 
VALUES 
    ('2010-09-16 13:16:22', 33.63), 
    ('2010-09-17 13:16:22', 33.53), 
    ('2010-09-20 11:26:30', 33.46), 
    ('2010-09-20 13:16:22', 33.46), 
    ('2010-09-21 11:26:30', 33.76), 
    ('2010-09-22 11:26:30', 33.56), 
    ('2010-09-23 11:26:30', 33.86), 
    ('2010-09-23 13:26:30', 33.86) 
; 

マイ所望の結果は次のとおりです。

Timestamps    Open 
2010-09-16 13:16:22  33.63 
2010-09-17 13:16:22  33.53 
2010-09-20 11:26:30  33.46 
2010-09-21 11:26:30  33.76 
2010-09-22 11:26:30  33.56 
2010-09-23 11:26:30  33.86 

または

Timestamps    Open 
2010-09-16 13:16:22  33.63 
2010-09-17 13:16:22  33.53 
2010-09-20 13:16:22  33.46 
2010-09-21 11:26:30  33.76 
2010-09-22 11:26:30  33.56 
2010-09-23 13:26:30  33.86 

私はこのクエリで重複を見つけることができます。

SELECT Timestamps, COUNT(SubTS) AS CountSub FROM 
(
    SELECT Timestamps,substr (Timestamps,1,10) AS SubTS, Open 
    FROM StockQuotes 
) 
GROUP BY SubTS HAVING (COUNT(SubTS)>1); 

しかし、最終的には、これは動作しません:

SELECT * FROM StockQuotes WHERE Timestamps NOT IN 
(
SELECT Timestamps, COUNT(SubTS) AS CountSub FROM 
(
    SELECT Timestamps,substr (Timestamps,1,10) AS SubTS, Open 
    FROM StockQuotes 
) 
GROUP BY SubTS HAVING (COUNT(SubTS)>1) 
); 

私のミスは何ですか?

+0

構造に問題があるように思われる根本原因を修正することを考えてください。 –

+0

あなたはそうです。根本原因を修正することは、同じ日からデータベースにダニを置かないことを意味します。しかし私は、異なる頻度(毎日、毎週など)のダニをデータベースに保存することを考えています。これらの目盛りを頻度でフィルタリングすることは、私のSQL知識のレベルではややこしいことです。だから私はちょうど '終末'を使用します。 – Bebass

+0

いいえ、1つのテーブルに2種類のファクトを格納しないことを意味します。私があなたの質問を正しく理解していれば、1日に1つの「公開」価値があります。あなたはその事実を保存するテーブルを持っていないようです。 'create table stock_opens(open_date date主キー、open_price decimal(10、2)not null);のようなものが良いスタートになります。 ' –

答えて

2

重複しているすべての行を除外しているため、両方のコピーが欠落しています。

GROUP BY使用し、(潜在的に)複数の入力行に対して一つの出力行を取得するには、次の

SELECT MAX(Timestamps) AS Timestamps, 
     Open 
FROM StockQuotes 
GROUP BY date(Timestamps); 

MAXは()は、グループ内の最新の行を取得することを保証します。

+0

これも正常に動作します。 substr()を避けるため、date()を使うのは良い考えです。 MAX()が本当に必要だと思いますか? 'GROUP BY date(Timestamps)'はすでにタイムスタンプを日付に切り詰めているためです。だから 'SELECT * FROM StockQuotes GROUP BY日付(タイムスタンプ); 'は同じ結果を返します。または私は間違っていますか? – Bebass

+0

MAX()は、グループから返すタイムスタンプを選択します。 –

+0

ありがとうございました。 SQLite構文に限定されておらず、約0.71秒で1.731行の結果が得られるので、私はあなたの答えを敬遠しました – Bebass

1

次のコマンドを使用して、重複を削除することができます

delete from StockQuotes where rowid not in (select max(rowid) from StockQuotes group by substr (Timestamps,1,10)); 

enter image description here はそれが仕事を願っています!間違っていれば私を訂正してください。

+0

はい、動作します。しかし、私はそれをデータの削除を避けるために 'select'に変換しました。実際のデータでは、CLのスライスよりもかなり遅いです。結果を返すためには1.17秒必要でした。 'substr(Timestamps、1,10)'を 'date(Timestamps)'に変更すると、0.84秒必要になりました。 – Bebass

関連する問題