Попытка отобразить совпадающие строки, которые совпадают с идентификатором, подсчитанным 3 или менее раз.Одноместный стол - PullRequest
0 голосов
/ 04 февраля 2019

Я довольно новичок в SQL и mySQL, я самоучка и пытаюсь написать запрос, который показывает мне все строки с числом 3 или меньше идентификатора, который совпадает в столбце ID.

Так, например:

Id       timestamp          Number            
--       ---------          ---
1        0001-12-01         1001
1        0001-12-02         3520
1        0001-12-01         1002
2        0001-12-02         2152
2        0001-12-01         1005
2        0001-12-02         1250
2        0001-12-01         1007
2        0001-12-02         1536
3        0001-12-01         1009
2        0001-12-02         1305
3        0001-12-01         1010
2        0001-12-02         1125
3        0001-12-01         1107
2        0001-12-02         1108

В идеале, результат будет выглядеть так:

Id       timestamp          Number            
--       ---------          ---
1        0001-12-01         1001
1        0001-12-01         1002
1        0001-12-02         3520
3        0001-12-01         1009
3        0001-12-01         1010
3        0001-12-01         1107

Это признает, что оба идентификатора "1" и идентификатор "3" имеют 3или меньше совпадающих / подсчитанных идентификаторов и отображает результаты по любому фильтру, который я установил.

Мне удалось написать запрос, который подсчитывает строки и показывает только те числа, которые равны 3 или меньше, но это группирует их по их идентификаторам и не отображает строки.Это выглядит примерно так:

select 
    concat(t1.id) as 'ID',
    t1.timestamp  as 'timestamp',
    count(t1.id) as 'Number'
from 
    table1 t1
where -- Curly braces are Metabase variables
    t1.timestamp between {{startdate}} and {{enddate}} 
group by t1.id
having count(*) < 3
order by id
limit 1000

Я провел несколько поисков по SO и другим ресурсам, но потерял сознание и надеялся, что кто-нибудь сможет дать мне руку или толкнуть в правильном направлении.,Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

Вы можете использовать объединение с группой подзапросов (*) по id

select * from table1  t1
    inner join  (

      select id
      from table1 
      group by  id 
      having count(*) <= 3 

    ) t on t.id  = t1.id 
0 голосов
/ 04 февраля 2019
 SELECT t1.*
 FROM YourTable t1
 WHERE id IN ( SELECT t2.id
               FROM YourTable t2
               WHERE t2.timestamp between {{startdate}} and {{enddate}} 
               GROUP BY t2.id
               HAVING COUNT(*) <= 3)
   AND t1.timestamp between {{startdate}} and {{enddate}} 
 ORDER BY t1.id
0 голосов
/ 04 февраля 2019

Вам необходимо объединить исходную таблицу с идентификаторами, найденными в сгруппированном запросе.

SELECT table1.*
FROM table1
JOIN (
    SELECT id
    FROM table1
    HAVING COUNT(*) <= 3
    GROUP BY id
) AS grouped ON table1.id = grouped.id

Кроме того, вам нужно использовать <= 3 вместо < 3.

...