SQL-困难查询

时间:2019-11-08 19:29:04

标签: mysql sql

我想查询一个查询,其中对于每个诊断代码-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

但是这会产生错误,我是否正朝正确的方向前进?您建议使用其他方法吗?

3 个答案:

答案 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

dbfiddle

答案 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