Вместо того, чтобы группировать, затем объединять, затем снова группировать, почему бы не объединить таблицы заказов и не работать оттуда:
SELECT c1.customer ,MAX(s2.dt_created) AS last_order_date
FROM customers c1
INNER JOIN (select customer, dt_created from archive_orders
union all select customer, dt_created from orders) s2
ON c1.customer = s2.customer
GROUP BY c1.customer
Помните, что в SQL ваша задача - сообщить системе , что вы хотите , а не , какие шаги / процедуры нужно выполнить, чтобы получить эти результаты . Вышеприведенное, логически, описывает то, что мы хотим - мы хотим, чтобы дата последнего заказа от заказов каждого клиента, и нас не волнует, был ли это заархивированный заказ или неархивированный.
Так как мы собираемся уменьшить информацию о заказе до одной строки (для каждого клиента) во время поведения GROUP BY
, нам также не нужно UNION
для удаления дубликатов, чтобы Я переключился на UNION ALL
.
(Признаюсь, я не мог реально увидеть, что ORDER BY
должен был добавить к миксу в этот момент, поэтому я не пытался включить его сюда. Если это входит в CTE, то подумайте на том факте, что CTE, как и таблицы и представления, не имеют присущего порядка . Единственное предложение ORDER BY
, которое влияет на порядок строк результатов, - это то, которое применяется к внешнему / окончательному SELECT
) [ 1117]
Дать orders
приоритет над archived_orders
:
;With CTE1 as (
SELECT c1.customer,group,MAX(s2.dt_created) as MaxInGroup
FROM customers c1
INNER JOIN (select customer, dt_created,2 as group from archive_orders
union all select customer, dt_created,1 from orders) s2
ON c1.customer = s2.customer
GROUP BY c1.customer,group
), CTE2 as (
SELECT *,ROW_NUMBER() OVER (PARTITION BY customer ORDER BY group) as rn
from CTE2
)
select * from CTE2 where rn = 1
Я думаю, что Ваше решение осуществимо и вероятно самый легкий подход. Просто templatize JavaScript и использование Django для введения точек данных как шаблона представляется.
Если бы Вы хотели стать более необычными, то Вы могли бы сделать, чтобы Django просмотрел, который подал точки данных как JSON (application/json), и затем используйте Ajax, чтобы перезвонить и получить данные на основе событий, которые происходят в браузере. Если Вы хотите, чтобы Ваше приложение было очень интерактивным выше и вне того, что обеспечивает OpenLayers, это могло бы стоить добавленной сложности, но конечно все это зависит от потребностей Вашего приложения.
Другим решением является создание формы, использующей виджет GeoDjango Admin. Для этого я:
Настройка GeneratePolygonAdminClass:
class GeneratePolygonAdmin(admin.GeoModelAdmin):
list_filter=('polygon',)
list_display=('object', 'polygon')
Где строится форма:
geoAdmin=GeneratePolygonAdmin(ModelWithPolygonField, admin.site)
PolygonFormField=GeneratePolygon._meta.get_field('Polygon')
PolygonWidget=geoAdmin.get_map_widget(PolygonFormField)
Dict['Polygon']=forms.CharField(widget=PolygonWidget()) #In this case, I am creating a Dict to use for a dynamic form
Заполнение виджета формы:
def SetupPolygonWidget(form, LayerName, MapFileName, DefaultPolygon=''):
form.setData({'Polygon':DefaultPolygon})
form.fields['Polygon'].widget.params['wms_layer']=LayerName
form.fields['Polygon'].widget.params['wms_url']='/cgi-bin/mapserv?MAP=' + MapFileName
form.fields['Polygon'].widget.params['default_lon']=-80.9
form.fields['Polygon'].widget.params['default_lat']=33.7
form.fields['Polygon'].widget.params['default_zoom']=11
form.fields['Polygon'].widget.params['wms_name']=YOURWMSLayerName
form.fields['Polygon'].widget.params['map_width']=800
form.fields['Polygon'].widget.params['map_height']=600
form.fields['Polygon'].widget.params['map_srid']=YOUR_SRID
form.fields['Polygon'].widget.params['modifiable']=True
form.fields['Polygon'].widget.params['map_options']={}
form.fields['Polygon'].widget.params['map_options']['buffer'] = 0
return form
На основе кода at: http://code.djangoproject.com/browser/django/branches/gis/django/contrib/gis/admin/options.py?rev=7980
Похоже, что вы можете использовать опцию extra_js для включения OpenStreetMap (я этого не тестировал).
.