Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8997843
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 15, 20262026-06-15T23:56:37+00:00 2026-06-15T23:56:37+00:00

I was wondering if someone could help me with some SQL for returning the

  • 0

I was wondering if someone could help me with some SQL for returning the amount of unique users logged into a database table during a period of two or more days (let’s use 7 days as a reference).

My log table contains a timestamp (ts) and user_id in each row, representing activity from that user at that time.

The following query returns the Daily Active Users or DAU from this log:

SELECT FLOOR(ts / 86400) AS day, COUNT(DISTINCT user_id) AS dau
FROM log
GROUP BY day ORDER BY day ASC

Now let’s say I would like to add to this single query (or at least retrieve in the most efficient possible fashion) the Weekly Active Users, or total unique users logged for a period of 7 days. However, I don’t want to divide my time in non-overlapping weeks. What I need is to count, for each day, the distinct user_ids seen during that day and the 6 previous days.

For example:

day users wau
1   1,2   2
4   1,3   3
7   3,4,5 5
8   5     4    (user_id 2 lost from count)
15  2     2    (user_ids 1,3,4 lost from count)

Thank you for any help you can provide and feel free to ask via comment if you need further clarification.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-15T23:56:38+00:00Added an answer on June 15, 2026 at 11:56 pm

    To get a “Weekly Average User” count (per my understanding of your specification… “for each day, the count of distinct user_ids seen during that day and the previous six days”), a query along the lines of the one below could be used. (The query also returns the “Daily Average User” count.

    SELECT d.day
         , COUNT(DISTINCT u.user_id) AS wau
         , COUNT(DISTINCT IF(u.day=d.day,u.user_id,NULL)) AS dau
      FROM ( SELECT FLOOR(k.ts/86400) AS `day`
               FROM `log` k
              GROUP BY `day`
           ) d
      JOIN ( SELECT FLOOR(l.ts/86400) AS `day`
                  , l.user_id
               FROM `log` l
              GROUP BY `day`, l.user_id
           ) u
        ON u.day <= d.day
       AND u.day > d.day - 7
     GROUP BY d.day
     ORDER BY d.day
    

    (I have not yet run a test of this; but I will later, and I will update this statement if any corrections are needed.)

    This query is joining the list of users for a given day (from the u rowsource), to a set of days from the log table (the d rowsource). Note the literal “7” that appears in the join predicate (the ON clause), that’s what’s getting the user list “matched” to the previous 6 days.

    Note that this could also be extended to get the distinct user count over the past 3 days, for example, by adding another expression in the SELECT list.

         , COUNT(DISTINCT IF(u.day<=d.day AND u.day>d.day-3,u.user_id,NULL)) AS 3day
    

    That literal “7” could be increased to get a larger range. And that literal 3 in the expression above could be changed to get any number of days… we just need to be sure we’ve got enough previous day rows (from d) joined to each row from u.

    PERFORMANCE NOTE: Due to the inline views (or derived tables, as MySQL calls them), this query may not be very fast, since the resultsets for those inline views has to be materialized into intermediate MyISAM tables.

    The inline view aliased as u may not be optimal; it might be faster to join directly to the log table. I was thinking in terms of getting a unique list of users for a given day, which is what that query in the inline view got me. It was just easier for me to conceptualize what was going on. And I was thinking that if you had hundreds of the same user entered for day, the inline view would weed out a whole bunch of the duplicates, before we did the join to the other days.
    A WHERE clause to limit the number of days we are returning would be best added inside the u and d inline views. (The d inline view would need to include an extra earlier 6 days.)


    On another note, if ts column is TIMESTAMP datatype, I would be more inclined to use a DATE(ts) expression to extract the date portion. But that would return a DATE datatype in the resultset, rather than an integer, which would be different from the resultset you specified.)

    SELECT d.day
         , COUNT(DISTINCT u.user_id) AS wau
         , COUNT(DISTINCT IF(u.day=d.day,u.user_id,NULL)) AS dau
      FROM ( SELECT DATE(k.ts) AS `day`
               FROM `log` k
              GROUP BY `day`
           ) d
      JOIN ( SELECT DATE(l.ts) AS `day`
                  , l.user_id
               FROM `log` l
              GROUP BY `day`, l.user_id
           ) u
        ON u.day <= d.day
       AND u.day > DATE_ADD(d.day, INTERVAL -7 DAY)
     GROUP BY d.day
     ORDER BY d.day
    

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Wondering if someone could help with with some Spring.net IOC integration into a .aspx
Just wondering if someone could help me with a very simple SQL query. I
I was wondering if someone could help me. Suppose I have some classes as
I am wondering if someone could help me with some probably rather simple code,
I was wondering if someone could help me with some javascript as I'm quite
I was wondering if someone could help with with some jquery code for doing
I was just wondering if someone could help me with some microdata. This is
I was wondering if someone could help me. Im trying to integrate some code
Wondering if someone could help me. I have next to no knowledge with Ajax,
I was wondering if someone could help me with this. I have defined my

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.