ich eine Selbst auszuführen versuche - auf einem Tisch sitzen, und suchen Sie nach allen Zeilen, die einen Satz übereinstimmen (Staat, office_type, office_class, Kreis), um Identifizieren Sie Bereiche von Daten, für die das Set keine Daten enthält.SQLAlchemy - Datumsbereich Gap Identifikationen, sind verantwortlich für Bereiche, die sich überlappen
Meine aktuelle Abfrage:
term_alias = aliased(schema.Term, name='term_alias')
query = Session.query(schema.Term, term_alias).filter(schema.Term.office_type_id == term_alias.office_type_id).\
filter(schema.Term.state_id == term_alias.state_id).\
filter(schema.Term.office_class == term_alias.office_class).\
filter(schema.Term.term_end < term_alias.term_begin).\
filter(or_(schema.Term.district_id == term_alias.district_id,
schema.Term.district_id == None)).\
group_by(schema.Term.term_end).\
group_by(schema.Term.state_id).\
group_by(schema.Term.office_class).\
group_by(schema.Term.office_type_id).\
having(schema.Term.term_end < func.min(term_alias.term_begin)).\
having((term_alias.term_begin - schema.Term.term_end) > 1)
Die Ergebnisse, die ich bekommen, sind nicht in vollem Umfang gültig.
Die hervorgehobene Zeile sollte nicht durchkommen.
Wie Sie sehen können, ist dies nicht eigentlich eine Lücke. Der 1. Ausdruck und der 2. Ausdruck überlappen und sollten daher nicht als Lücke enthalten sein.
Ich habe ein paar Variationen über die obige Abfrage versucht, aber die richtigen Ergebnisse sind mir entgangen. Meine Frage ist, wie kann ich überlappende Daten berücksichtigen? und sicherzustellen, nur wahre Lücken gemeldet werden,
RAW SQL als gedruckte von print(query)
SELECT terms.id AS terms_id, terms.term_begin AS terms_term_begin, terms.term_en
d AS terms_term_end, terms.term_served AS terms_term_served, terms.office_type_i
d AS terms_office_type_id, terms.person_id AS terms_person_id, terms.state_id AS
terms_state_id, terms.district_id AS terms_district_id, terms.removal_reason_id
AS terms_removal_reason_id, terms.political_party_id AS terms_political_party_i
d, terms.is_elected AS terms_is_elected, terms.is_holdover AS terms_is_holdover,
terms.neat_race_id AS terms_neat_race_id, terms.office_class AS terms_office_cl
ass, terms.notes AS terms_notes, terms.is_vacant AS terms_is_vacant, term_alias.
id AS term_alias_id, term_alias.term_begin AS term_alias_term_begin, term_alias.
term_end AS term_alias_term_end, term_alias.term_served AS term_alias_term_serve
d, term_alias.office_type_id AS term_alias_office_type_id, term_alias.person_id
AS term_alias_person_id, term_alias.state_id AS term_alias_state_id, term_alias.
district_id AS term_alias_district_id, term_alias.removal_reason_id AS term_alia
s_removal_reason_id, term_alias.political_party_id AS term_alias_political_party
_id, term_alias.is_elected AS term_alias_is_elected, term_alias.is_holdover AS t
erm_alias_is_holdover, term_alias.neat_race_id AS term_alias_neat_race_id, term_
alias.office_class AS term_alias_office_class, term_alias.notes AS term_alias_no
tes, term_alias.is_vacant AS term_alias_is_vacant
FROM terms, terms AS term_alias
WHERE terms.office_type_id = term_alias.office_type_id AND terms.state_id = term
_alias.state_id AND terms.office_class = term_alias.office_class AND terms.term_
end < term_alias.term_begin AND (terms.district_id = term_alias.district_id OR t
erms.district_id IS NULL) GROUP BY terms.term_end, terms.state_id, terms.office_
class, terms.office_type_id
HAVING terms.term_end < min(term_alias.term_begin) AND term_alias.term_begin - t
erms.term_end > :param_1
SQLFiddle in seinem aktuellen Zustand: http://sqlfiddle.com/#!9/3e030/1
Wow !!!! Ich kam nicht einmal näher ... Ich kann dir nicht genug für deine Hilfe danken. Es sieht so aus, als würde es mit minimalen Tests arbeiten. Ich muss die ganze Arbeit durchkämmen, damit ich sie richtig verstehen kann. Nochmals vielen Dank, dass Sie sich die Zeit genommen haben, mir dabei zu helfen. – Busturdust
Ihre Kommentare und Erklärungen sind 10x besser als alles, was ich sonst wo gefunden habe. Ich wünschte, ich könnte +1000 geben. Danke noch einmal. – Busturdust