2012-03-25 8 views
0

オブジェクトが存在する頻度を確認し、存在する回数に基づいて+ 1を与える関数を作成しようとしています。SQLとPythonを使用してテーブル内のオブジェクトにスコアを適用する

sqliteデータベースとpythonの使用。

select distinct Date, Name from history order by Date Desc 

が返されます:

Date  Name 
2012-25-03  a 
2012-25-03  b 
2012-25-03  c 
2012-25-03  d 
2012-24-03  b 
2012-24-03  c 
2012-24-03  d 
2012-24-03  e 
2012-23-03  c 
2012-23-03  d 
2012-23-03  e 
2012-23-03  f 

は、基本的にはPythonやSQLのいずれかに次のように達成するために探して:

a = 1 
b = 2 
c = 3 
d = 3 
e = 2 
f = 1 

私はイテレータとサブクエリを使用してPythonでいくつかの異なるアプローチを試みてきました、しかし、成功していない、多分それは行うことができます/行う必要がありますSQLです。

誰もが楽しめる時間!

答えて

0
SELECT Name 
    , COUNT(*) AS cnt 
FROM history 
GROUP BY Name 
ORDER BY Name 

擬似コードです:

 , COUNT(DISTINCT Date) AS cnt 

(更新)あなたのSQLiteバージョンはCOUNT(DISTINCT column)をサポートしていない場合は、その場合にはサブクエリを使用することができます。

SELECT Name 
    , COUNT(*) AS cnt 
FROM 
    (SELECT DISTINCT 
      Name, Date 
     FROM history 
    ) AS h 
GROUP BY Name 
ORDER BY Name 
+0

これは素晴らしいことでもありました。 – wintermute

0

なぜ単にsqlでcount関数を使用しないのですか?これにより、同じDateName、あなたが二重にCOUNT(*)を変更、それらの行をカウントしたくないとの複数の行を持っている可能性がある場合は...

counts = 
result = <query_function>("select distinct Name from history") 
for result in results: 
    result2 = <query_function>("select count(*) from history where Name LIKE ?", result.Name) 
    counts[result.Name] = result2 

for key,value in counts.iteritems(): 
    print '%s = %d' % (key,value) 
+0

これを行うには最悪の方法があります。 –

+0

私はそれが厄介であり、(潜在的に大量の)大量のDBクエリをもたらすことに感謝しますが、私はロジックを実証しようとしていました。 –

2

これはSQLで簡単です。 COUNT集約関数を使用するだけです。

SELECT `Name`, COUNT(*) FROM `history` GROUP BY `Name`; 
+0

援助ありがとう、これは完璧です。 – wintermute

関連する問題