所以,我不確定它是如何作業的,也沒有通過谷歌搜索找到足夠的答案(可能沒有使用正確的流行語)。所以它來了:假設我有一張這樣的桌子,我們稱之為人
| ID | 姓名 | 名 | 國家 |
|---|---|---|---|
| 1 | 能源部 | 約翰 | 美國 |
| 2 | 能源部 | 約翰 | 英國 |
| 3 | 能源部 | 約翰 | 巴西 |
| 4 | 邁耶 | 朱莉婭 | 德國 |
| 5 | 邁耶 | 朱莉婭 | 奧地利 |
| 6 | 皮卡德 | 讓-呂克 | 法國 |
| 7 | 皮卡德 | 讓-呂克 | 英國 |
| 8 | 中村 | 光郎 | 日本 |
好的,所以現在我想選擇所有具有相同名稱和名字并且至少有一個國家是英國的行。所以我的結果集應該是這樣的。
| ID | 姓名 | 名 | 國家 |
|---|---|---|---|
| 1 | 能源部 | 約翰 | 美國 |
| 2 | 能源部 | 約翰 | 英國 |
| 3 | 能源部 | 約翰 | 巴西 |
| 6 | 皮卡德 | 讓-呂克 | 法國 |
| 7 | 皮卡德 | 讓-呂克 | 英國 |
我的意思是,我知道如何找到這樣的雙打
SELECT *
FROM persons p1
JOIN (SELECT NAME, FIRST_NAME, count(*) FROM PERSONS
GROUP BY FIRST_NAME, NAME having count(*) >1) p2
ON p1.NAME = p2.NAME
AND p1.FIRST_NAME = p2.FIRST_NAME;
但這也導致 Julia Meyer 在那里,我不希望她在那里。
有什么建議么?
uj5u.com熱心網友回復:
有條件地計算感興趣的國家
SELECT *
FROM persons p1
JOIN (
SELECT NAME, FIRST_NAME
FROM PERSONS
GROUP BY FIRST_NAME, NAME
having count(*) > 1 and count(case country = 'UK' then 1 end) >= 1
) p2 ON p1.NAME = p2.NAME
AND p1.FIRST_NAME = p2.FIRST_NAME;
uj5u.com熱心網友回復:
使用EXISTS:
SELECT p1.*
FROM persons p1
WHERE EXISTS (
SELECT *
FROM persons p2
WHERE p2.ID <> p1.ID
AND p2.Name = p1.Name AND p2.FirstName = p1.FirstName
AND 'UK' IN (p1.Country, p2.Country)
);
請參閱演示。
uj5u.com熱心網友回復:
我想選擇所有具有相同名稱和名字并且至少有一個國家是英國的行。
您可以將COUNT分析函式與條件聚合一起使用(并在單個表掃描中解決問題,無需任何自聯接):
SELECT id, name, first_name, country
FROM (
SELECT t.*,
COUNT(CASE country WHEN 'UK' THEN 1 END)
OVER (PARTITION BY name, first_name) AS cnt
FROM table_name t
)
WHERE cnt > 0;
其中,對于樣本資料:
CREATE TABLE table_name (ID, Name, First_Name, Country) AS
SELECT 1, 'Doe', 'John', 'USA' FROM DUAL UNION ALL
SELECT 2, 'Doe', 'John', 'UK' FROM DUAL UNION ALL
SELECT 3, 'Doe', 'John', 'Brazil' FROM DUAL UNION ALL
SELECT 4, 'Meyer', 'Julia', 'Germany' FROM DUAL UNION ALL
SELECT 5, 'Meyer', 'Julia', 'Austria' FROM DUAL UNION ALL
SELECT 6, 'Picard', 'Jean-Luc', 'France' FROM DUAL UNION ALL
SELECT 7, 'Picard', 'Jean-Luc', 'UK' FROM DUAL UNION ALL
SELECT 8, 'Nakamura', 'Hikaro', 'Japan' FROM DUAL;
輸出:
ID 姓名 名 國家 1 能源部 約翰 美國 2 能源部 約翰 英國 3 能源部 約翰 巴西 6 皮卡德 讓-呂克 法國 7 皮卡德 讓-呂克 英國
如果要查找至少有一個的重復行,UK則還要計算磁區中的所有行:
SELECT id, name, first_name, country
FROM (
SELECT t.*,
COUNT(CASE country WHEN 'UK' THEN 1 END)
OVER (PARTITION BY name, first_name) AS cnt_uk,
COUNT(*)
OVER (PARTITION BY name, first_name) AS cnt_all
FROM table_name t
)
WHERE cnt_uk > 0
AND cnt_all >= 2;
這為樣本資料提供了相同的輸出。
db<>在這里擺弄
uj5u.com熱心網友回復:
有 2 個條件,1) 包含 'UK' 和 2) count(1) > 1。因此,下面的這個查詢可以作業。
SELECT p1.*
FROM persons p1
WHERE (p1.NAME, p1.FIRST_NAME) IN (
SELECT p2.NAME, p2.FIRST_NAME
FROM persons p2
WHERE p2.Country = 'UK') AND
AND (p1.NAME, p1.FIRST_NAME) IN (
SELECT p3.NAME, p3.FIRST_NAME
FROM persons p3
GROUP BY p3.NAME, p3.FIRST_NAME
HAVING COUNT(1) > 1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/467488.html
上一篇:選擇MAX值和GROUPBY
