Cómo realizar el seguimiento de que el usuario visita el sitio cada día durante X días?

StackOverflow https://stackoverflow.com/questions/932610

  •  06-09-2019
  •  | 
  •  

Pregunta

Hay una nueva tarjeta de identificación en desbordamiento de pila. La insignia " woot " se otorga a los usuarios visitaron el sitio cada día durante 30 días. ¿Cómo se puede implementar una función como esta? ¿Cómo se puede realizar un seguimiento de que un usuario visita el sitio cada día para los días X en la forma más sencilla?

pensé en tener dos campos - una para la fecha y hora de la última entrada, y otro para contar los días en forma continua usuario visitó el sitio. La lógica es fijar primero el contador a 1, y almacenar la hora de inicio de sesión también. En la siguiente entrada, compruebe si desde el último inicio de sesión no más de un día pasado, y aumentar el contador, o volver de nuevo a 1. Y a continuación, actualizar el campo de marca de tiempo a la fecha actual.

Se puede hacer que sea más fácil?

¿Fue útil?

Solución

Usted necesita tener una galleta, ya que la gente no puede Acceder todos los días - por ejemplo, porque está en el sistema de forma automática durante 2 semanas, o porque están en su sitio haciendo cosas que no -stop sin dormir y almuerzo durante 50 horas :) Es probable que en realidad desea contar cuando el usuario accede al sitio.

Ahora, se podría grabar en teoría cada acceso y realizar consultas de bases de datos, como se sugirió anteriormente, pero se podría pensar (como yo) que equilibra correctamente entre la utilidad y la privacidad + simplicidad.

El algoritmo especificado es deficiente en una forma obvia: ya que almacenar sólo número entero de días, se le pasa el usuario que se registra de entrada y salida cada 12 horas (el algoritmo de mantendrían la cuenta de los días como 1)

Aquí está la solución que me parece ser más limpio con dos Los campos de fecha por usuario, en una especie de Python no orientados a objetos explica por sí mismo:

# user.beginStreak----user.lastStreak is the last interval when 
# user accessed the site continuously without breaks for more than 25h 

def onRegister (user):
    ...
    user.beginStreak = user.endStreak = time() # current time in seconds 
    ...

def onAccess (user): 
    ...
    if user.endStreak + 25*60*60 < time():
        user.beginStreak = time()
    user.endStreak = time()
    user.wootBadge = ( user.endStreak-user.beginStreak > 30*24*60*60 )
    ...

(Por favor, perdona mis habilidades Pythonic, soy un usuario del sitio académico y por primera vez)

No se puede hacer esta tarea con una variable . Estoy seguro de que alguien puede escribir un argumento limpia probar este hecho.

Otros consejos

En realidad, si las visitas del miembro están en una base de datos SQL, se puede hacer todo esto con una sola consulta SQL. Esta es también, probablemente, más rápido que schlepping todos los datos a través de un programa cliente para comprobar que de todos modos:

/*
    Find all members who visited at least once every day
  for 30 or more days.  --RBarryYoung, 2009-05-31
*/
;WITH
  cteVisitDays as (
    Select
      MemberID
    , DATEDIFF(dd,'2008-06-01',VisitTime) as VisitDay
     From tblMembersLog
     Where Not Exists( Select * From tblMemberTags T
    Where T.MemberID = tblMembersLog.MemberID
     And T.TagName = 'WOOT!' )
     Group By MemberID
        , DATEDIFF(dd,'2008-06-01',VisitTime)
    )
, cteVisitRunGroups as (
    Select 
      MemberID
    , VisitDay - Row_Number() Over(
            Partition By MemberID
            Order By VisitDay
        ) as RunGrouping
     From cteVisitDays
     )
SELECT Distinct
  MemberID
 From cteVistRunGroups
 Group By MemberId, RunGrouping
 Having COUNT(*) >= 30

Seguimiento de cada visita en su base de datos con una marca de tiempo (que probablemente ya lo hacen de todos modos). A continuación, cree una instrucción SQL y el grupo el resultado por día, mientras que se cuenta el número de visitas ese día. En el período de los últimos 30 días, no se les permite tener un día 0-visita ...

Me segundo enfoque de ropstah. Estadísticas de usuario como el tiempo de inicio de sesión, etc suelen estar disponibles en la base de datos. Tenemos que derivar ciertos hechos de los datos disponibles. Así que en lugar de tener un contador para cada visita e incrementando las cosas, yo preferiría un trabajo por lotes que se ejecuta en los datos de acceso de usuarios y publicar los resultados de ese día.

Pero una vez que un usuario ed "woot", es posible que desee dejar de computar "woot" ness para ese usuario. De lo contrario, existe la posibilidad de que el usuario recibe "wooted" todos los días, hasta que se encuentre un día de no-inicio de sesión. (Pero esto es una cuestión de menor importancia).

Si esto es lo único que desea iniciar sesión, entonces tal vez eso es una buena solución. Sin embargo, me gusta mantener la lógica y el registro por separado, tanto para aumentar la cantidad de información en bruto a mi disposición, así como permitir ajustes de la lógica sin romper los datos existentes.

En este caso, me gustaría registrar cada visita o cada acción (dependiendo de los requerimientos / espacio / etc), y luego escribir un procedimiento almacenado o un método en alguna parte, que inspeccionó los datos y devuelve verdadero (coincide con los criterios de placa) o falso ( no coincide con los criterios).

El único caso en el que me gustaría crear un esquema específico para almacenar la información de esa manera era si los cálculos necesarios tomaron demasiado tiempo, ya sea debido a la cantidad de datos o la complejidad de los mismos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top