[英]SQL specific WHERE clause
我是 SQL 新手,正在尝试组织一些具有特定限制的棒球数据。
我得到了当天的数据,局,投手的投手,以及是在局的顶部还是底部。
有没有一种方法可以有效地查询系统,只有当一局投手有一个单一的投手时我才会取回数据?
|-----------------------------------|
| 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 都在所述局投球。
您可以按每一inning
您的数据进行分组,并且只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
)
您可以考虑以下几点:
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)
在 BigQuery 中,您可以使用:
select as value any(t)
from t
group by t.inning
having min(pitcher) = max(pitcher);
下面是 BigQuery 标准 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.