我想查询一个查询,其中对于每个诊断代码-ID(这是一列),请选择最常用药物的名称-p_name(另一列),用于治疗该疾病,即,更经常使用的药物名称似乎与该诊断的处方(表格)相关。
这是我的处方表的结构:
cnx = pyodbc.connect(server=servername, database = DBname, user=Username,
tds_version='7.3',password=Password,port=portno,
driver='/usr/local/lib/libtdsodbc.so')
我首先进行查询以计算元组对p_name和ID:
| p_name | lab | doctor_VAT | date_timestamp | ID | dosage | prescription_description |
然后对此,我尝试将“ greatest_n_per_group”问题应用于此 (SQL select only rows with max value on a column):
SELECT DISTINCT p.ID,
p.p_name,
COUNT(*) OVER (PARTITION BY p.p_name, p.ID) AS Cnt
FROM prescription AS p
ORDER BY Cnt DESC
但是这会产生错误,我是否正朝正确的方向前进?您建议使用其他方法吗?
答案 0 :(得分:1)
由于MySQL支持Window函数,因此您可以简单地使用-
SELECT ID, p_name
FROM (SELECT ID, p_name, RANK() OVER(PARTITION BY ID ORDER BY CNT DESC) RNK
FROM (SELECT ID,
p_name,
COUNT(*) CNT
FROM prescription
GROUP BY ID,
p_name
) T1
) T2
WHERE RNK = 1
答案 1 :(得分:0)
SELECT
p1.ID,
(SELECT TOP 1 p2.p_name
FROM prescription AS p2
WHERE p2.ID=p1.ID
GROUP BY p2.p_name
ORDER BY count(*) DESC) as MostUsed
FROM prescription AS p1
GROUP BY p1.ID
上面是MSSQL,下面是MySQL
SELECT
p1.ID,
(SELECT p2.p_name
FROM prescription AS p2
WHERE p2.ID=p1.ID
GROUP BY p2.p_name
ORDER BY count(*) DESC
LIMIT 1) as MostUsed
FROM prescription AS p1
GROUP BY p1.ID
答案 2 :(得分:0)
在这种情况下,您需要FROM()T,T是FROM子查询子句的表名别名
FROM (SELECT DISTINCT p.ID,
p.p_name,
COUNT(*) OVER (PARTITION BY p.p_name, p.ID) AS Cnt
FROM prescription AS p
ORDER BY Cnt DESC) as Tabela
INNER JOIN(
SELECT Tabela2.ID, MAX(Tabela2.Cnt)
FROM (SELECT DISTINCT p.ID,
p.p_name,
COUNT(*) OVER (PARTITION BY p.p_name, p.ID) AS Cnt
FROM prescription AS p
ORDER BY Cnt DESC) as Tabela2
GROUP BY Tabela2.ID
) T