SQL Speci c WHERE предложение - PullRequest
       0

SQL Speci c WHERE предложение

0 голосов
/ 08 января 2020

Я новичок в SQL и пытаюсь организовать некоторые бейсбольные данные с определенными c ограничениями.

Мне даны данные дня, иннинга, питчера, который качает, и ли это верх или низ иннинга.

Есть ли способ эффективно запросить систему, где я получу данные только тогда, когда для иннинга есть отдельный кувшин?

|-----------------------------------|
| day | inning | pitcher| top_bottom|
|  1       1        AE1      top    |
|  1       1        AE1      top    |
|  1       1        AE1      top    |
|  1       2        AE1      top    |
|  1       2        AE1      top    |
|  1       2        AE2      top    |
|-----------------------------------|

Результатом будут первые 3 строки, так как в каждом случае кувшин был AE1, тогда как я не получал бы три нижних строки, так как оба кувшина AE1 и AE2 разбили в указанном иннинге.

Ответы [ 4 ]

0 голосов
/ 08 января 2020

Ниже для BigQuery Standard SQL

#standardSQL
SELECT * EXCEPT(singular_pitcher)
FROM (
  SELECT *, 1 = COUNT(DISTINCT pitcher) OVER(PARTITION BY day, inning) singular_pitcher
  FROM `project.dataset.table`  t
)
WHERE singular_pitcher
0 голосов
/ 08 января 2020

Вы можете рассмотреть следующее:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,inning INT NOT NULL
,pitcher CHAR(3) NOT NULL
);

INSERT INTO my_table VALUES
(1,1,'AE1'),
(2,1,'AE1'),
(3,1,'AE1'),
(4,2,'AE1'),
(5,2,'AE1'),
(6,2,'AE2');

SELECT DISTINCT x.* 
           FROM my_table x 
           LEFT 
           JOIN my_table y 
             ON y.inning = x.inning 
            AND y.pitcher <> x.pitcher 
            AND y.id <> x.id 
          WHERE y.id IS NULL;
+----+--------+---------+
| id | inning | pitcher |
+----+--------+---------+
|  1 |      1 | AE1     |
|  2 |      1 | AE1     |
|  3 |      1 | AE1     |
+----+--------+---------+
3 rows in set (0.00 sec)
0 голосов
/ 08 января 2020

В BigQuery вы можете использовать:

select as value any(t)
from t
group by t.inning
having min(pitcher) = max(pitcher);
0 голосов
/ 08 января 2020

Вы можете сгруппировать данные по каждому inning и взять только те группы, которые имеют только один отдельный кувшин:

select inning, max(pitcher) as pitcher
from your_table
where day = 1
group by inning
having count(distinct pitcher) = 1

Если вам нужна полная запись, а не только 2 столбца, вы можете сделать:

select * 
from your_table
where inning in 
(
  select inning
  from your_table
  where day = 1
  group by inning
  having count(distinct pitcher) = 1
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...