2017-11-28 23 views
-2

次のクエリの結果から重複する行を削除します。SQL Serverで重複する行を削除する方法

私のテーブルには、次のようになります。

idx  writetime   iu_id iu_nickname ib_idx Gamecnt 
--------------------------------------------------------------- 
1456885 2017-11-27 02:51:00 csw0322 csw0322  885452 2 
1456886 2017-11-27 02:51:00 csw0322 csw0322  885452 2 
1456887 2017-11-27 02:51:00 csw0322 csw0322  885454 3 
1456888 2017-11-27 02:51:00 csw0322 csw0322  885454 3 
1456889 2017-11-27 02:51:00 csw0322 csw0322  885454 3 
1456893 2017-11-27 04:29:00 csw0322 csw0322  885457 2 
1456894 2017-11-27 04:29:00 csw0322 csw0322  885457 2 
1456895 2017-11-27 04:29:00 csw0322 csw0322  885456 2 
1456896 2017-11-27 04:29:00 csw0322 csw0322  885456 2 

私が望む結果がこれです:

idx  writetime   iu_id iu_nickname ib_idx Gamecnt 
--------------------------------------------------------------- 
1456885 2017-11-27 02:51:00 csw0322 csw0322  885452 2 
1456887 2017-11-27 02:51:00 csw0322 csw0322  885454 3 
1456893 2017-11-27 04:29:00 csw0322 csw0322  885457 2 
1456895 2017-11-27 04:29:00 csw0322 csw0322  885456 2 

私はこのクエリを試してみましたが、私は結果を得ることができません。

SELECT 
    a.idx, a.writetime, 
    a.iu_id, a.iu_nickname, 
    a.ib_idx, 
    COUNT(a.ib_idx) OVER (PARTITION BY a.ib_idx) AS Gamecnt 
FROM 
    bet_log AS a 
INNER JOIN 
    info_betting AS b ON a.ib_idx = b.ib_idx 
WHERE 
    a.ib_idx IN (SELECT a.ib_idx 
       FROM bet_log AS a 
       GROUP BY a.ib_idx 
       HAVING COUNT(*) > 1) 
+2

ここから始めましょう。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/「私は結果を得ることができません」とはどういう意味ですか?間違った結果、エラーメッセージ、結果が得られませんか? –

答えて

0

row_number()を提供SQLは、一般的な方法である。

SELECT b.* 
FROM (SELECT bl.idx, bl.writetime, bl.iu_id, bl.iu_nickname, bl.ib_idx, 
      ROW_NUMBER() OVER (PARTITION BY bl.writetime, bl.iu_id, bl.iu_nickname, bl.ib_idx ORDER BY bl.idx) as seqnum 
     FROM bet_log bl INNER JOIN 
      info_betting ib 
      ON bl.ib_idx = ib.ib_idx 
    ) b 
WHERE seqnum = 1; 
1

単にyour_table以来group by

select min(idx), writetime, iu_id, iu_nickname, ib_idx, Gamecnt 
from your_table 
group by writetime, iu_id, iu_nickname, ib_idx, Gamecnt 

を使用し、おそらくあなたは、その後

select min(idx), writetime, iu_id, iu_nickname, ib_idx, Gamecnt 
from (
    SELECT a.idx, 
    a.writetime, 
    a.iu_id, 
    a.iu_nickname, 
    a.ib_idx, 
    Count(a.ib_idx) 
    OVER( 
     partition BY a.ib_idx) AS Gamecnt 
    FROM bet_log AS a 
    INNER JOIN info_betting AS b 
      ON a.ib_idx = b.ib_idx 
    WHERE a.ib_idx IN (SELECT a.ib_idx 
       FROM bet_log AS a 
       GROUP BY a.ib_idx 
       HAVING Count(*) > 1) 
) t 
group by writetime, iu_id, iu_nickname, ib_idx, Gamecnt 
0
SELECT distinct 
     a.writetime, 
     a.iu_id, 
     a.iu_nickname, 
     a.ib_idx, 
     Count(a.ib_idx) 
     OVER( 
      partition BY a.ib_idx) AS Gamecnt 
FROM bet_log AS a 
     INNER JOIN info_betting AS b 
       ON a.ib_idx = b.ib_idx 
WHERE a.ib_idx IN (SELECT a.ib_idx 
        FROM bet_log AS a 
        GROUP BY a.ib_idx 
        HAVING Count(*) > 1) 
+0

と 'idx'はどこですか? ;) –

+0

これは 'idx'カラムをまったく返しません。 –

0

最後に別のグループを追加すると、これはselect distinctを使うよりも効率的です。

SELECT a.idx, 
      a.writetime, 
      a.iu_id, 
      a.iu_nickname, 
      a.ib_idx, 
      Count(a.ib_idx) 
      OVER( 
       partition BY a.ib_idx) AS Gamecnt 
    FROM bet_log AS a 
      INNER JOIN info_betting AS b 
        ON a.ib_idx = b.ib_idx 
    WHERE a.ib_idx IN (SELECT a.ib_idx 
         FROM bet_log AS a 
         GROUP BY a.ib_idx 
         HAVING Count(*) > 1) 
    GROUP BY 
      a.idx, 
      a.writetime, 
      a.iu_id, 
      a.iu_nickname, 
      a.ib_idx 
関連する問題