2

こんにちは、次のような mysql db テーブルがあります。

      date                  id                   name 

   2012-09-18               1                     A
   2012-09-18               2                     B
   2012-09-18               1                     C
   2012-09-17               1                     D
   2012-09-17               1                     A
   2012-09-17               2                     A
   2012-09-16               1                     A
   2012-09-16               1                     E

ID = 1 の望ましい結果

     DATE                  UNIQUES
   2012-09-18               1      
   2012-09-17               1  
   2012-09-16               2  

言葉による説明

date でグループ化された ID ごとに一意の名前をカウントしたい。例えば。9月16日 このテーブルでは、A、E が 9 月 16 日より前に発生しないため、uniques =2 です。9月17日 D はこのテーブルで 9 月 17 日より前に発生せず、A は 9 月 16 日にすでに発生しているため、uniques = 1 です。

4

3 に答える 3

2
SELECT
`date`,
SUM(CASE WHEN EXISTS(SELECT 1 FROM yourTable u2 WHERE u1.date > u2.date AND u1.name = u2.name) THEN 0 ELSE 1 END) AS uniques
FROM
yourTable u1
WHERE id = 1
GROUP BY 1
于 2012-09-18T09:07:41.780 に答える
0
create table t (d date, id integer, name varchar(30));

insert into t (d, id, name) values
('2012-09-18', 1, 'A'),
('2012-09-18', 2, 'B'),
('2012-09-18', 1, 'C'),
('2012-09-17', 1, 'D'),
('2012-09-17', 1, 'A'),
('2012-09-17', 2, 'A'),
('2012-09-16', 1, 'A'),
('2012-09-16', 1, 'E')
;

select d as `DATE`, count(*) as UNIQUES
from (
    select name, min(d) as d
    from t
    where id = 1
    group by name
    ) s
group by `DATE`
order by `DATE` desc
;
+------------+---------+
| DATE       | UNIQUES |
+------------+---------+
| 2012-09-18 |       1 |
| 2012-09-17 |       1 |
| 2012-09-16 |       2 |
+------------+---------+
于 2012-09-18T12:40:22.603 に答える
-1

私のおすすめ:

SELECT `date`,
       Sum(CASE
             WHEN so_far = 1 THEN 1
             ELSE 0
           end) AS UNIQUES
FROM   (SELECT a.`date`,
               a.id,
               a.name,
               Count(DISTINCT b.`date`) AS so_far
        FROM   srctable AS a
               JOIN srctable AS b
                 ON ( a.id = b.id
                      AND a.name = b.name
                      AND a.`date` >= b.`date` )
        GROUP  BY a.`date`,
                  a.id,
                  a.name) AS tab
WHERE  id=1
GROUP  BY `date` 

相関していないので、かなり良いパフォーマンスになるはずです。

編集

環境に動機付けられてクエリを修正しましたが、実際には改善の余地がありました。

SELECT a.`date` AS adt,
       Sum(CASE
             WHEN b.`date` IS NULL THEN 1
             ELSE 0
           end) AS unq
FROM   some_table AS a
       LEFT JOIN some_table AS b
              ON ( a.id = b.id
                   AND a.name = b.name
                   AND a.`date` > b.`date` )
WHERE  a.id = 1
GROUP  BY a.`date`,
          a.id;  

疑問がある場合は、sqlfiddleを確認して、最終的に他の提案されたソリューションと比較できます。

于 2012-09-18T09:34:18.990 に答える