The different commands that dataview queries can be made up of. Commands are
executed in order, and you can have duplicate commands (so multiple
blocks or multiple
GROUP BY blocks, for example).
FROM statement determines what pages will initially be collected and passed onto the other commands for further
filtering. You can select from any source, which currently means by folder, by tag, or by incoming/outgoing links.
- Tags: To select from a tag (and all its subtags), use
- Folders: To select from a folder (and all its subfolders), use
- Single Files: To select from a single file, use
- Links: You can either select links TO a file, or all links FROM a file.
- To obtain all pages which link TO
- To obtain all pages which link FROM
[[note]](i.e., all the links in that file), use
You can compose these filters in order to get more advanced sources using
- For example,
#tag and "folder"will return all pages in
[[Food]] or [[Exercise]]will give any pages which link to
You can also "negate" sources to obtain anything that does NOT match a source using
-#tagwill exclude files which have the given tag.
#tag and -"folder"will only include files tagged
#tagwhich are NOT in
Filter pages on fields. Only pages where the clause evaluates to
true will be yielded.
Obtain all files which were modified in the last 24 hours:
LIST WHERE file.mtime >= date(today) - dur(1 day)
Find all projects which are not marked complete and are more than a month old:
LIST FROM #projects WHERE !completed AND file.ctime <= date(today) - dur(1 month)
Sorts all results by one or more fields.
SORT date [ASCENDING/DESCENDING/ASC/DESC]
You can also give multiple fields to sort by. Sorting will be done based on the first field. Then, if a tie occurs, the second field will be used to sort the tied fields. If there is still a tie, the third sort will resolve it, and so on.
SORT field1 [ASCENDING/DESCENDING/ASC/DESC], ..., fieldN [ASC/DESC]
Group all results on a field. Yields one row per unique field value, which has 2 properties: one corresponding to the field being grouped on, and a
rows array field which contains all of the pages that matched.
GROUP BY field GROUP BY (computed_field) AS name
In order to make working with the
rows array easier, Dataview supports field "swizzling". If you want the field
test from every object in the
rows array, then
rows.test will automatically fetch the
test field from every object in
rows, yielding a new array.
You can then apply aggregation operators like
flat() over the resulting array.
Flatten an array in every row, yielding one result row per entry in the array.
FLATTEN field FLATTEN (computed_field) AS name
For example, flatten the
authors field in each literature note to give one row per author:
TABLE authors FROM #LiteratureNote FLATTEN authors
|stegEnvironmentalPsychologyIntroduction2018 SN||Steg, L.|
|stegEnvironmentalPsychologyIntroduction2018 SN||Van den Berg, A. E.|
|stegEnvironmentalPsychologyIntroduction2018 SN||De Groot, J. I. M.|
|Soap Dragons SN||Robert Lamb|
|Soap Dragons SN||Joe McCormick|
|smithPainAssaultSelf2007 SN||Jonathan A. Smith|
|smithPainAssaultSelf2007 SN||Mike Osborn|
A good use of this would be when there is a deeply nested list that you want to use more easily.
Note the simpler query though the end results are slightly different (grouped vs non-grouped).
You can use a
GROUP BY file.link to achieve identical results but would need to use
rows.T.text as described earlier.
table T.text as "Task Text" from "Scratchpad" flatten file.tasks as T where T.text
table filter(file.tasks.text, (t) => t) as "Task Text" from "Scratchpad" where file.tasks.text
FLATTEN makes it easier to operate on nested lists since you can then use simpler where conditions on them as opposed to using functions like
Restrict the results to at most N values.
Commands are processed in the order they are written, so the following sorts the results after they have already been limited:
LIMIT 5 SORT date ASCENDING