属性テーブル(またはレイヤー)の単一の列から異なる値を選択する


16

ArcMapの列から個別の値を選択する方法はありますか?GDBとSHPの両方の形式のデータがあります。SQL、QueryLayers、ModelBuilder、個々のツールボックスを使用して選択する方法を検索しましたが、すべての選択オプションは常にSELECT * FROM tableName WHERE ...

SQLでは、SELECT DISTINCT columnName FROM tableNameを記述します。

回答:


17

または、ArcToolBoxツールのFrequency(Analysis Tools >> Statistics >> Frequency)を実行して、一意の値とそれらが表示される回数のカウントを含むテーブルを出力できます。

または、フィールドでSearchCursorを取得するpythonスクリプトを作成し、フォームのすべての値のリストを作成することもできます

if value not in myList:
    myList.append(value)

3
ArcInfoライセンスがない場合は、このツールボックスを使用します(シェープファイルでのみテスト) resources.arcgis.com/gallery/file/geoprocessing/…–

3
以前はArcInfo関数を必要としていた多くの関数を、かなり単純なPythonコード/モジュールを使用して実装できるようになりました。それは素晴らしい!
RyanKDalton-OffTheGridMaps

ダン、ありがとう。私のライセンスは周波数ツールボックスをサポートしていませんでした。
スティーブ

12

Pythonリスト内包表記を使用します。

import arcpy
fldName = 'val_fld'
fcName = 'feature_class.shp'
#set creates a unique value iterator from the value field
myList = set([row.getValue(fldName) for row in arcpy.SearchCursor(fcName)]) 

大規模なデータセットの場合、メモリ効率の良い方法は、ジェネレータ式を使用することです。

myList = set((row.getValue(fldName) for row in arcpy.SearchCursor(fcName,fields=fldName))

1
1つのフィールドのみに関心があるので、パフォーマンスを向上させるために、オプションのfields引数を指定します。たとえばmyList = set([row.getValue(fldName) for row in arcpy.SearchCursor(fcName, fields=fldName)])
blah238

良いアイデア。パフォーマンスの違いをテストしたいと思います。SDEデータソースの場合は重要である可能性がありますが、シェープファイルとファイルジオデータベースの場合、かなりの量であれば驚かれることでしょう。
ターレン

これは素晴らしい。これをうまく示すリンクがありましたが、ある日壊れました。seが長い間これを持っていることを願っています。
ジャスティン

4

データがPGDB形式の場合、サブクエリを使用して、クエリビルダーダイアログ(定義クエリ、属性による選択、ツールボックス式など)内で以下を実行できます。

SELECT * FROM tableName WHERE ...

column_to_test_for_unique_values IN 
(SELECT column_to_test_for_unique_values
FROM table_name
GROUP BY column_to_test_for_unique_values HAVING
Count(column_to_test_for_unique_values)=1)

これにより、column_to_test_for_unique_valuesの値が一意であるレコードが返されます。


1
パーソナルジオデータベース上でDISTINCTを使用することもできます。
ヤクブSisak GeoGraphics


1

データがSDE(空間データベースエンジン)にある場合、pythonとarcpyのArcSDESQLExecuteオブジェクトを使用できます。この「メソッド」を使用して複雑なSQLを渡すことができます。

# set up executor for sql
executor = arcpy.ArcSDESQLExecute(sde_connection_sql)

# sql statements
select_max = """select max(LOAD_ID) from SDE.FEATURE_CLASS"""

# get load id
result_max_id = executor.execute(select_max)

0

または、Pythonスクリプトを使用してCSVにエクスポートし、別のデータベース(SpatiaLiteなど)のPython APIを使用してcsvを読み取り、同じスクリプト内から適切なSQLクエリを実行します。大きなテーブルの場合、これ独自のリストビルダー-dunnoを展開するよりも少し速いかもしれません

どのように実行しても、これは依然としてArcGISの非常に迷惑な「機能」です。


0

distinctサブクエリでを使用するのはどうですか(以下はFGDBフィーチャクラスです):

"STATE_NAME" = (select distinct "STATE_NAME" from EsriUsaCountiesDetailed)

ヘルプ(10.0)から、これには制限があることに注意してください。

カバレッジ、シェープファイル、およびその他の非ジオデータベースファイルベースのデータソースは、サブクエリをサポートしていません。


2
「DISTINCT」は、File GDBではなくPersonal GDBでのみ機能します。
ヤクブSisak GeoGraphics

0

ジャスティンが示唆するように。私は通常、必要なフィールドでサマリーを作成し、dbfで個別の選択を実行して少しの計算を実行し、各個別の値を分類してから元の値に結合します。
それは長い道のりであり、あなたはあなたの好きな計算方法でfenagelする必要があります。しかし...
仕事を成し遂げるものは何でも。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.