Appear in the forum more difficult question sql: 29 (the value of a column in the function group row_number consecutive flagged 3 times)

Original: appearing in the forums more difficult question sql: 29 (the value of a column in the function group row_number consecutive flagged 3 times)

In the forum, I met a lot more difficult sql problem, although they can be resolved, but found a few days later, they can not remember, forget the solution of.

So, I feel the need to be recorded, so that after the encounter this problem again, and get answers from the idea.



A column value is set within 3 consecutive times marked

as follows, eid of personnel ID, for a same EID, date column appears more than 3 times, FLAG column labeled 1.
try to use an UPDATE statement!

eid date    flag
1 2013-3-1
1 2013-3-2
1 2013-3-4
1 2013-3-5
1 2013-3-7 1
1 2013-3-8 1
1 2013-3-9 1
1 2013-3-11
1 2013-3-12
1 2013-3-14 1
1 2013-3-15 1
1 2013-3-16 1
1 2013-3-18
2 2013-3-1
2 2013-3-2
2 2013-3-4
2 2013-3-6 1
2 2013-3-7 1
2 2013-3-8 1
2 2013-3-9 1
2 2013-3-11 1
2 2013-3-12 1
2 2013-3-13 1
2 2013-3-15
2 2013-3-16
2 2013-3-18 1
2 2013-3-19 1
2 2013-3-20 1
3 2013-3-1
3 2013-3-2
3 2013-3-4 1
3 2013-3-5 1
3 2013-3-6 1
3 2013-3-8
3 2013-3-9
3 2013-3-12 1
3 2013-3-13 1
3 2013-3-14 1
3 2013-3-15 1
3 2013-3-18 1
3 2013-3-19 1
3 2013-3-20 1


My method:


   
   
  1. CREATE TABLE #t (eid INT, DATE DATETIME, flag INT )
  2. GO
  3. INSERT #t(eid, DATE,flag)
  4. select 1, '2013-3-1', null union
  5. select 1, '2013-3-2', null union
  6. select 1, '2013-3-4', null union
  7. select 1, '2013-3-5', null union
  8. select 1, '2013-3-7', 1 union
  9. select 1, '2013-3-8', 1 union
  10. select 1, '2013-3-9', 1 union
  11. select 1, '2013-3-11', null union
  12. select 1, '2013-3-12', null union
  13. select 1, '2013-3-14', 1 union
  14. select 1, '2013-3-15', 1 union
  15. select 1, '2013-3-16', 1 union
  16. select 1, '2013-3-18', null union
  17. select 2, '2013-3-1', null union
  18. select 2, '2013-3-2', null union
  19. select 2, '2013-3-4', null union
  20. select 2, '2013-3-6', 1 union
  21. select 2, '2013-3-7', 1 union
  22. select 2, '2013-3-8', 1 union
  23. select 2, '2013-3-9', 1 union
  24. select 2, '2013-3-11', 1 union
  25. select 2, '2013-3-12', 1 union
  26. select 2, '2013-3-13', 1 union
  27. select 2, '2013-3-15', null union
  28. select 2, '2013-3-16', null union
  29. select 2, '2013-3-18', 1 union
  30. select 2, '2013-3-19', 1 union
  31. select 2, '2013-3-20', 1 union
  32. select 3, '2013-3-1', null union
  33. select 3, '2013-3-2', null union
  34. select 3, '2013-3-4', 1 union
  35. select 3, '2013-3-5', 1 union
  36. select 3, '2013-3-6', 1 union
  37. select 3, '2013-3-8', null union
  38. select 3, '2013-3-9', null union
  39. select 3, '2013-3-12', 1 union
  40. select 3, '2013-3-13', 1 union
  41. select 3, '2013-3-14', 1 union
  42. select 3, '2013-3-15', 1 union
  43. select 3, '2013-3-18', 1 union
  44. select 3, '2013-3-19', 1 union
  45. select 3, '2013-3-20', 1
  46. go
  47. select eid,
  48. date,
  49. flag,
  50. case when count(*) over( partition by eid, DATEadd( day,- rownum, date)) >= 3
  51. then 1
  52. else null
  53. end '计算出来的flag值' -- 这列和你插入到flag中的值是一样的
  54. from
  55. (
  56. select *,
  57. ROW_NUMBER() over( partition by eid order by date) rownum
  58. from #t
  59. )t
  60. /*
  61. eid date flag 计算出来的flag值
  62. 1 2013-03-01 00:00:00.000 NULL NULL
  63. 1 2013-03-02 00:00:00.000 NULL NULL
  64. 1 2013-03-04 00:00:00.000 NULL NULL
  65. 1 2013-03-05 00:00:00.000 NULL NULL
  66. 1 2013-03-07 00:00:00.000 1 1
  67. 1 2013-03-08 00:00:00.000 1 1
  68. 1 2013-03-09 00:00:00.000 1 1
  69. 1 2013-03-11 00:00:00.000 NULL NULL
  70. 1 2013-03-12 00:00:00.000 NULL NULL
  71. 1 2013-03-14 00:00:00.000 1 1
  72. 1 2013-03-15 00:00:00.000 1 1
  73. 1 2013-03-16 00:00:00.000 1 1
  74. 1 2013-03-18 00:00:00.000 NULL NULL
  75. 2 2013-03-01 00:00:00.000 NULL NULL
  76. 2 2013-03-02 00:00:00.000 NULL NULL
  77. 2 2013-03-04 00:00:00.000 NULL NULL
  78. 2 2013-03-06 00:00:00.000 1 1
  79. 2 2013-03-07 00:00:00.000 1 1
  80. 2 2013-03-08 00:00:00.000 1 1
  81. 2 2013-03-09 00:00:00.000 1 1
  82. 2 2013-03-11 00:00:00.000 1 1
  83. 2 2013-03-12 00:00:00.000 1 1
  84. 2 2013-03-13 00:00:00.000 1 1
  85. 2 2013-03-15 00:00:00.000 NULL NULL
  86. 2 2013-03-16 00:00:00.000 NULL NULL
  87. 2 2013-03-18 00:00:00.000 1 1
  88. 2 2013-03-19 00:00:00.000 1 1
  89. 2 2013-03-20 00:00:00.000 1 1
  90. 3 2013-03-01 00:00:00.000 NULL NULL
  91. 3 2013-03-02 00:00:00.000 NULL NULL
  92. 3 2013-03-04 00:00:00.000 1 1
  93. 3 2013-03-05 00:00:00.000 1 1
  94. 3 2013-03-06 00:00:00.000 1 1
  95. 3 2013-03-08 00:00:00.000 NULL NULL
  96. 3 2013-03-09 00:00:00.000 NULL NULL
  97. 3 2013-03-12 00:00:00.000 1 1
  98. 3 2013-03-13 00:00:00.000 1 1
  99. 3 2013-03-14 00:00:00.000 1 1
  100. 3 2013-03-15 00:00:00.000 1 1
  101. 3 2013-03-18 00:00:00.000 1 1
  102. 3 2013-03-19 00:00:00.000 1 1
  103. 3 2013-03-20 00:00:00.000 1 1
  104. */

Published 416 original articles · won praise 135 · views 940 000 +

Guess you like

Origin www.cnblogs.com/lonelyxmas/p/12020055.html