Fletcher CJ Trainings/Notes from FGI

Direct link to Fletcher Training folder: https://tufts.box.com/s/v2lx622whvqa3lq9tgidmp1imfpcxcnn

If Tristan provided notes/summaries, those appear before the timestamps.

Fletcher CJ Training #1 9/4/2024

Introductions
1:50 overview of what FGI is doing/goals
3:30 wants people to be interactive; has standard examples, but wants to use real examples
4:21 Bases/person v.application
10:00 one to one and one to many relationships
10:30 related records
17:45 sample build, everyone who has a rank 1 address in MA
22:40 different types of exports and how they are grouped
24:30 adding rank 2 address
25:37 deleting exports using ctrl-click and drag
28:00 adding filter for rank 2 address in MA
30:30 filters are automatically 'and'
32:00 sample build, applications from people whose rank 1 address is MA
24:30 base join
41:00 direct versus extended exports
recommendation to keep extended exports turned off, and do joins directly to the query overall
50:00 direct join
53:00 one row per base

Fletcher CJ Training #2 9/11/2024

We revisited the joins to addresses, explored a similar case with schools, and got our first look at subqueries. We discussed how the choice of base determines what each row in the query represents (one row per person vs. one row per application vs. one row per school etc.). Toward the end of the call, we touched briefly on querying for form responses, which we'll cover in more depth next week. If you're building queries throughout the week and trying to recreate what we did on the call, be sure to save any examples where you're not seeing the results you expect!

1:50 review of address build
7:00 determination of table ranks https://knowledge.technolutions.net/docs/database-structure-determination-of-table-ranks
10:30 renaming joins to prevent confusion
14:00 adding 'or' in filters
15:50 old STL 'active' address is the same as #1 rank overall
16:45 application by population base
18:00 sample query, application base: finding applications from people who went to Tufts before (rank 1)
26:00 subquery: looking for Tufts across all previous schools
31:50 check logic button
33:00 (the problem of) base joins to multiple schools
36:00 adding sorts and filter to that base join
39:00 one row per school
44:30 different types of bases
46:30 sample query school base
50:00 sample query form responses
53:00 join to form
53:45 question looking for the first form response

Fletcher CJ Training #3 9/20/2024

We reviewed a couple of joins for address and application, then explored how Slate can help answer the question of which specific form response was submitted first. We validated the joins we added by comparing the results inside a subquery export, talked about sorts, and mentioned the ability to filter date fields using relative values like "today" or "today - 3 years". As attribution reporting was of interest to the group, we previewed what was possible with origin groups and sources. While most of the time this will be used in queries for person records or applications, we also talked about how it was possible, at least in theory, to go the other direction, pulling a list of origin sources (or forms, interactions, etc.) and finding the count of records for which that was the first source.

1:00 Troubleshooting: why is US missing in list of countries in exports--in STL exports, Tristan showed how US is hard coded to return null--may have been custom coded for Fletcher
8:00 review of CJ version of that query
12:00 using a subquery to find all of the enrolling students
14:45 direct v. extended filter reminder
16:15 using <> with dates
16:55 relative dates (today - x) days are default; weeks, years, fortnights ?! but probably not months
18:45 subquery export from applications
19:40 concatenate output
21:30 form responses, starting with people
22:50 adding a sort
23:40 adding details of which form
24:40 limiting which forms are returned
29:30 adding subquery export of other forms returned
36:50 Origin Sources overview
44:00 Sample query on Origin Sources
47:45 existence export
48:30 system query : one row per origin source group name, or origin group source type
--> Tristan off in the weeds satisfying his own curiosity: independent subqueries, reviewing the SQL in a custom SQL base, trying to see what he can get attached back to person for origin sources
but does eventually come back round to doing a count of people who have each type of origin source

Fletcher CJ Training #4 10/2/2024

Leigh asked a question about ways to query on application progress; while there isn't an out-of-the-box way to get at this data, we explored a few thoughts on the call:

  • For a Slate-hosted application, when someone clicks through the pages of the application, what actually happens behind the scenes for custom application pages is that the form response is submitted when they click away. So, while it would be a rough approximation, you could in theory pull the count of form responses associated with their application record: e.g. someone starts an application and has clicked through the first three pages of the app, I would expect to see 3 form responses started. That's not question-level data, and legacy app pages built with XSLT rather than custom forms would not be stored in quite the same way, but it could still be interesting to track.

  • In terms of materials received/checklist items fulfilled, this is more straightforward. You can use a subquery export to get the aggregate count of the total checklist items that someone needs to submit, and then pull the count of those with a certain status, like all those still in 'Awaiting' to calculate percent complete. It's possible for a subquery export to calculate this using a formula, but the issue we ran into on the call is that the nested export for an aggregate returns an integer and doesn't easily allow you to convert this to a real number, which you'd need for the percentage. Tinkering with this after the call, I found that you'd either have to nest this one layer deeper, add some custom SQL to the formula (a try_convert), or rewrite the formula to multiple the integer values by 1.0 to force Slate to convert the data type to real. If any of those are of interest, let me know and I can mock up an example for our next call, but I would say those are all fairly advanced/not something you would encounter day-to-day when building queries.

  • The 'In Progress' link shown on an individual record will display the hard fails/application requirements not yet received, but this still isn't available to query on directly as the conditions are just evaluated on the fly based on the current app logic. In order to get at this in the aggregate, it would be necessary to recreate all of the hard fail logic in a query, which likely wouldn't be worth the lift.

We also discussed the differences between a base join and a subquery filter, using as our example the goal of trying to return a list of admitted applications. We explored why trying to answer the question "Does this application have 'Admit' among its decisions?" uses a subquery (looking across the many) while "Does this application have 'Admit' as its most recent decision?" would use a base join (we're interested in one specific decision, their most recent).

00:25 Fletcher question: partial applications (unsubmitted) can you determine how much of it an applicant has done? Or at least how many documents they have submitted?

16:00 Lead scoring possibilities

21:30 clicking on the status link in the application dashboard shows the hard fails under app logic

28:20 export values in queries--short value shows by default, if it exists

29:35 translation codes

31:00 export timestamps for when fields were set

33:40 sample subquery build admitted applicants

36:00 test record tag subquery

45:00 build; 49:00 explanation of base join versus subquery filter

51:50 different types of decision by rank joins

Fletcher CJ Training #5 10/11/2024

We discussed a number of decision examples, comparing how we could pull in the most recent decision or use a subquery filter to check across all of a person's decisions, and what a subquery export would look like if we wanted to pull a comma-separated list of all their decisions. We also looked at how we could use subqueries to check for the existence of another application for the same person, where that other application had a deny decision. Finally, we looked at how we could use comparisons in subquery filters to compare various dates, like the first event date vs. the app submitted date.

00:35 sample build: finding admitted applicants

2:30 decision by rank, decision by rank confirmed, decision by rank released, decision by rank reversed

6:00 subquery filter within decision

8:00 no default sort on base subquery joins (doesn't matter for decisions, usually, but does matter for other things)

9:25 most recent sort: descending order

14:20 concatenate list of decisions

19:00 existence subquery filter

25:00 subquery versus base join

32:15 sample build: has previous application with deny decision

35:30 count of apps > 1

40:00 nesting subqueries to compare to make sure we are not looking at the current app

44:00 date comparisons

46:00 wizard hat on joins provides more export options automatically

Fletcher CJ Training #6 10/18/2024

In this session, we walked through a number of troubleshooting examples where joins were misconfigured or where nuances of EXISTS NOT IN vs. NOT EXISTS IN affected the results. Leigh also asked about the location information that sometimes appears on student timelines tied to message clicks or ping activity; the message track query base does have an export for Region, and we could get at country as well with a formula export. Other location information on the timeline appears to be derived from the [person.login] table, and one of the library exports that FGI added includes the most recent login city.

:30 troubleshooting: why don’t I get Tufts students in this query?

5:00 why does a Slate ID search in the old Prospect base not return the particular student? Old prospect base excluded records tagged with the Opt Out

7:15 How to reconstruct that Prospects without opt-outs in CJ’s

8:45 the problem with base joins to tag records

12:15 the difference between EXISTS NOT IN and NOT EXISTS

16:20 example of applications that do not have the admit decision

24:00 not exists, not in

32:20 question: api feed from Bird to create interactions--how tricky is it? discussion of source formats

40:00 Tristan found the brand new Inquiry Details entity

41:20 IP addresses/location data--querying on messages

  • message is one row per message received

  • message track--one row per open/click

  • login table has city data

Fletcher CJ Training #7 10/25/2024

In this session, we walked through the library exports that FGI has set up in the Fletcher instance and also talked about how to create your own library exports for common exports and filters that you'd like to reuse in future queries. As we saw, sometimes library exports and filters can be added without any additional configuration, but in most cases they still expect that you would configure something about them: a tags filter for example might expect that you select the tag name you want to check for, it would just save you the steps of adding joins to get to that point.

0:00 Query Library

3:30 exports and filters organized by base

3:45 ability to create custom Query Library

5:00 individuals have to be added in order to have access

6:05 [CONFIGURE] in name requires end user adding data

8:00 once you add something to your query, you can adjust it and not affect the master version

8:50 cut and pasting exports

9:48 creating your own personal query library

[Nick will own the query library for Fletcher]

15:45 tags

17:15 practice building with query library

22:10 sample: subquery filter on export to show ONLY the specified tag, with blanks if the person did not have the value

25:45 rather than the specific people, which would be controlled by a filter

27:15 population discussion

30:00 query library filter finding people who have x number of applications

36:20 origin source sample; configuring the joins

 

Fletcher CJ Training #8 11/1/2024

We explored some more advanced concepts like independent subqueries and closed things out with a discussion of some of the less common query bases.

2:00 independent subquery example: next event happening near student address

5:30 filter for date within the next month (today + 30)

13:20 comparing first source to whether or not there is an application

15:30 existence export to determine if there is an application

21:00 reminders abut most recent versus any

22:00 other query bases

  • form query: one row per event

  • form response: one row per registration

  • message: one row per email received

  • message track: one row per click/open

  • 27:05 system: lookup tables, list of fields/prompts

    • count of times a particular prompt value is selected within records

 

Nov 11: Reporting #1

1:30 navigation

2:00 definition and sample build

8:00 adding columns

9:15 adding a data table

10:30 group by program

12:10 year over year comparisons

13:30 calculations/formula as column type

17:10 sorting rows

20:30 limiting the number of rows returned

22:00 validating report numbers

25:45 counting form responses

33:30 adding grouping by month using format masks

36:30 column groupings

39:30 reporting on first event attendance

45:45 reporting on person-scoped events

47:50 export to query, including using top-level exports

50:30 pie charts, geo maps

54:30 timeline

Nov 18 Reporting #2: Rebuilding High Value reports demo

1:00 Year-to-Date Application Report with percentage change

13:00 duplication of row filter/column filters

17:00 redundant date filters

22:30 nullif in formula

23:00 format percentage

28:00 format mask for row name when grouping

31:00 static content/section titles

31:20 adding citizenship section

33:30 race and ethnicity section

34:15 round key as an evergreen filter

36:00 multi-value fields (race)

39:20 double counting --disaggregate ‘2 or more’

45:45 Event Attendance

46:50 links out to specific events

51:45 using specific form response base for a specific event

 

Slate Captain CJ’s Deep Dive 9/17/2024

0:00 difference between local and CJ’s

3:30 recreation of delivered STL exports and filters as Library Export

5:30 old modifying local filters and exports and how that compares to the new query libraries

11:00 option to restrict permissions in library exports

12:00 toggling which groups are available

12:25 extended exports

16:00 new nomenclature can be a stumbling block

18:40 can build your own personal query libraries

19:25 configure in name of exports

20:30 can you make a deliminated export split out into multiple columns?

20:45 no, one export = 1 column, but can duplicate and use rank 1, rank 2, etcetera

22:22 schools 1-5 are included in the library exports

23:30 explanation most common related bases

Form Responses

27:00 effectiveness of yield events: connecting the form response to application and person

35:55 reports versus queries for counting mixing scopes

35:50 aggregate subquery exports counts final join

39:00 nesting subquery filters

41:00 total event registrations

45:00 independent subquery comparisons

49:00 comparison of app dates and event dates

--still has one more hour of time with Tristan--