我需要先洗掉 SELECT 中的重復項,然后再計算它們。我需要計算已經完成了多少次測驗。患者無法在相同的測驗中獲得相同的值。我曾嘗試過DISTINCT,但它會是 aGROUP BY(DISTINCT)而不是GROUP BY(GROUP BY). 它幾乎相同,但DISTINCT會洗掉我需要在 patient_test 表中的其他列。我將視圖用作一種良好的做法,但我不確定這是否有幫助。
TLDR:我想改進嵌套的 GROUP BY,但我找不到方法。
table: patient_test (12 rows)
Patient | Test | Value
--------------------------------
Laura | Test A | 1.3
Laura | Test B | 8.9 <-
Laura | Test B | 8.9 <-
Laura | Test C | 8.9
Charles | Test B | 8.9
Charles | Test B | 4.6
Charles | Test C | 5.6
Maria | Test A | 1.2 <--
Maria | Test A | 1.2 <--
Maria | Test B | 1.2
Maria | Test B | 8.9
Maria | Test C | 1.2
我以這種方式排除重復項
SELECT * FROM patient_test
GROUP BY Patient , Test, Value
要得到:
table: patient_test (10 rows)
Patient | Test | Value
--------------------------------
Laura | Test A | 1.3
Laura | Test B | 8.9
Laura | Test C | 8.9
Charles | Test B | 8.9
Charles | Test B | 4.6
Charles | Test C | 5.6
Maria | Test A | 1.2
Maria | Test B | 1.2
Maria | Test B | 8.9
Maria | Test C | 1.2
然后我這樣計算它們:(我想要改進的)
SELECT TestName, count(*) AS Result FROM
(SELECT * FROM patient_test
GROUP BY Patient , Test, Value) AS tempPatient
GROUP BY tempPatient.TestName;
我正在使用視圖,但我認為GROUP BY立即排除重復項和它們可能會更好。
SELECT TestName, count(*) AS Result FROM
(CustomView) AS tempPatient
GROUP BY tempPatient.TestName;
我不能將此作為解決方案的一部分,因為它會洗掉我在其他程序中需要的其他列。
SELECT DISTINCT Patient,Test,Value
FROM patient_test
這就是我需要的:
TestName | Result
----------------------
Test A | 2
Test B | 5
Test C | 3
我認為沒有必要運行 GROUP BY兩次。我想找到一種使用示例排除重復項的方法。任何幫助或建議都會很好。
uj5u.com熱心網友回復:
DISTINCT與其他資料庫不同,MySql 允許使用inside參考多個列COUNT():
SELECT Test, COUNT(DISTINCT Patient, Value) AS Result
FROM patient_test
GROUP BY Test;
請參閱演示。
uj5u.com熱心網友回復:
你所做的似乎很好。我會做一些非常相似的事情:
SELECT
T.Test,
COUNT(*) AS Result
FROM
(
SELECT DISTINCT
Patient,
Test,
Value
FROM
patient_test
) T
GROUP BY
T.Test
;
如果表中有重復項,則必須使用分組或區分來洗掉它們——在這種情況下,這幾乎是標準的操作程式。
uj5u.com熱心網友回復:
在MySQL 8 您可以使用 row_number 時,磁區依據patient,test,value將創建唯一值。如果存在相同的值,row_num 將 >1。
with cte as
( select *, row_number () over(partition by patient,test,value ) as row_num
from patient_test
) select *
from cte;
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=089755b482817991b06e58a5caa675e9
要僅計算唯一值添加where row_num=1條件
with cte as
( select *, row_number () over(partition by patient,test,value ) as row_num
from patient_test
) select test,count(value) as nr_count
from cte
where row_num=1
group by test
order by test asc;
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=e18??41a84eb872d1c047c2c969d80a002
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/486149.html
