2016-04-29 9 views
0

私の目標は、のtest_sname値を持つ2つのレコードを選択するために、各PIDのために、ある値を持つ2行を選択し、同じentry_dateで発生し、「want2」「をしたいです」。私はtest_snamesの両方を含む最初の5 entry_datesについてこれを行います。MySQLのクエリ - 2特定DISTINCT列が

これは、これを達成するための私のクエリです:

queryBuilder = 
"""select PID, test_sname, test_value, units, ref_range, entry_date from labs 
    where PID=%s and (test_sname='want' or test_sname='want2') and entry_date in 

    (select entry_date from labs where PID=%s and test_sname in ('want', 'want2') 
    group by entry_date having count(*) = 2) 

    order by entry_date limit 10;""" % (pid, pid) 

予想通りENTRY_DATEがのtest_sname含まれている2行のみがあるとき、それが機能するか「want2」「をしたいです」。 (正しい)クエリの

PID  |test_sname |test_value |units |entry_date 
10000000 | want  |   343 | U/L  | 2008-01-01 01:01:01 
10000000 | want2  |  984.34 |   | 2008-01-01 01:01:01 
10000000 | NA1  |   56 | %  | 2008-01-01 01:01:01 
10000000 | NA2  |   420 | mg/dL | 2008-01-01 01:01:01 
10000000 | NA2  |   420 | mg/dL | 2008-01-02 01:01:01 

10000000 | want  |   343 | U/L  | 2008-01-02 01:01:01 
10000000 | want2  |  984.34 |   | 2008-01-02 01:01:01 
10000000 | NA1  |   26 | %  | 2008-01-02 01:01:01 
10000000 | NA2  |   410 | mg/dL | 2008-01-02 01:01:01 
10000000 | NA2  |   455 | mg/dL | 2008-01-02 01:01:01 

結果:

PID  |test_sname |test_value |units |entry_date 
10000000 | want  |   343 | U/L  | 2008-01-01 01:01:01 
10000000 | want2  |  984.34 |   | 2008-01-01 01:01:01 
10000000 | want  |   343 | U/L  | 2008-01-02 01:01:01 
10000000 | want2  |  984.34 |   | 2008-01-02 01:01:01 

例えば、のtest_sname同じに 'をしたい' から複数の行がある場合、問題が来ますentry_date。having count(*) = 2は無効です。このようなデータの結果はありません。制限として

PID  |test_sname |test_value |units |entry_date 
11111111 | want  |   343 | U/L  | 2009-10-26 07:25:00 
11111111 | want2  |  984.34 |   | 2009-10-26 07:25:00 
11111111 | want  |  189 | U/L  | 2009-10-26 07:25:00 
11111111 | NA1  |   50 | %  | 2009-10-26 07:25:00 
11111111 | NA2  |   40 | mg/dL | 2009-10-26 07:25:00 
11111111 | NA3  |  84.55 |   | 2009-10-26 07:25:00 
11111111 | NA4  |  4.5 | thou/uL | 2009-10-26 07:25:00 
11111111 | NA5  |  14.6 | g/dL | 2009-10-26 07:25:00 
11111111 | NA6  |  0.96 | mg/dL | 2009-10-26 07:25:00 

11111111 | want  |   343 | U/L  | 2009-10-30 07:25:00 
11111111 | want2  |  984.34 |   | 2009-10-30 07:25:00 
11111111 | want  |  189 | U/L  | 2009-10-30 07:25:00 
11111111 | NA1  |   6 | %  | 2009-10-30 07:25:00 
11111111 | NA2  |   40 | mg/dL | 2009-10-30 07:25:00 
11111111 | NA3  |  84.55 |   | 2009-10-30 07:25:00 
11111111 | NA4  |  4.5 | thou/uL | 2009-10-30 07:25:00 
11111111 | NA5  |  14.6 | g/dL | 2009-10-30 07:25:00 
11111111 | NA6  |  0.96 | mg/dL | 2009-10-30 07:25:00 

、私は(私は自分自身で問題を解決しないであろうということを知っている)サブクエリでlimit 2を入れてみましたが、それはこのエラーを与えた、と私は私がほとんどを持っていたと思いましたSQLの更新されたバージョンので、私はサブクエリでlimitを使用することはできません。

This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' 

私はこの問題を解決するために、複数の方法があります実現 - 私はすべての値を選択して、プログラムはPythonで私が必要なものを取ることができるが、私は、Pythonを使って書かれたMySQLのクエリ・ソリューションを探していますmySQLコネクタ。私はしかし、Pythonのソリューションについては不平を言うことはありません。

私は、MySQL-コネクタv2.1.3およびMySQLサーバーv5.7.11とのお時間を

おかげでPythonのv3.4.4を使用しています!

答えて

1

サブクエリによるグループ化の実行回数の使用を検討してください。次に、RowNoが1または2のいずれかをフィルタリングします。このようにして、すべてのPIDが処理されるため、パラメータを渡す必要はありません。以下は、ラボテーブルにユニークな識別子があると仮定して、ID

SELECT * 
FROM 
    (SELECT PID, test_sname, test_value, units, ref_range, entry_date,  
      (SELECT count(*) FROM labs sub 
      WHERE sub.test_sname in ('want', 'want2') 
      AND sub.PID = labs.PID 
      AND sub.entry_date = labs.entry_date 
      AND sub.ID <= labs.ID) As RowNo 
    FROM labs 
    WHERE test_sname in ('want', 'want2') 
    ) As dT 
WHERE dT.RowNo <= 2 

# PID  test_sname test_value  units ref_range    entry_date RowNo 
# 10000000  want   33  U/L  4-40  2008-01-01 01:01:01  1 
# 10000000  want2  98.34       2008-01-01 01:01:01  2 
# 10000000  want   33  U/L  4-40  2008-01-02 01:01:01  1 
# 10000000  want2  98.34       2008-01-02 01:01:01  2 
# 11111111  want   33  U/L  Apr-40  2009-10-26 07:25:00  1 
# 11111111  want2  98.34       2009-10-26 07:25:00  2 
# 11111111  want   33  U/L  Apr-40  2009-10-30 07:25:00  1 
# 11111111  want2  98.34       2009-10-30 07:25:00  2