我想在我的表格中将ID分组为三组,每天选择一组,并每隔4天重复一次。我不知道我是否正确解释但我会尝试在一个例子上做。我们说我们有ids 1,2,3,4,5,6,7,8,9,10...n
我想在第二天1,4,7,10...n
和第三天2,5,8,11...n
选择3,6,9,12...n
的第一天。当我对奇数和偶数id做几乎相同时,这非常容易。在奇怪的日子里,我选择了奇怪的ids甚至几天甚至是ids。但是现在我需要在3天内完成它。提前谢谢。
答案 0 :(得分:2)
SELECT * FROM TABLE
WHERE
id%3 = 1 -- for day 1
id%3 = 2 -- for day 2
id%3 = 0 -- for day 3
或者您可以使用:
SELECT * FROM TABLE
WHERE CASE WHEN id % 3 = 0 THEN 3
ELSE id % 3
END = YourDayNumber
样品:
SELECT id,
'Day ' + CAST(CASE WHEN id % 3 = 0 THEN 3
ELSE id % 3
END AS VARCHAR(100)) DayNbr
FROM
(
SELECT 1 id
UNION
SELECT 2
UNION
SELECT 3
UNION
SELECT 4
UNION
SELECT 5
UNION
SELECT 6
UNION
SELECT 7
UNION
SELECT 8
UNION
SELECT 9
) a
答案 1 :(得分:2)
使用MOD(x,y)函数返回x的余数除以y和函数TO_DAYS(some_date_here),它返回自第0年以来的天数。通过在TO_DAYS中使用函数NOW(),我们得到一个每天都有新号码。也把它放在模数中,这将产生一个每3天生成一个循环,它将选择像
这样的ID... 1,4,7,10-
第二天
... 2,5,8,11-
第二天
3,6,9,12
第二天又从顶部回来
因此,此查询无需每天修改即可运行:
SELECT * FROM my_table WHERE MOD(my_id,3)=MOD(TO_DAYS(NOW()),3)
这种分组可以轻松改变,只需更改" 3"无论你想要什么(小心你都需要改变" 3" BOTH MOD()
s)
答案 2 :(得分:0)
SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+
SELECT * FROM ints WHERE MOD(i,3) = MOD(DATEDIFF(CURDATE(),'2015-03-20'),3);
+---+
| i |
+---+
| 1 |
| 4 |
| 7 |
+---+
SELECT * FROM ints WHERE MOD(i,3) = MOD(DATEDIFF(CURDATE(),'2015-03-21'),3);
+---+
| i |
+---+
| 0 |
| 3 |
| 6 |
| 9 |
+---+
SELECT * FROM ints WHERE MOD(i,3) = MOD(DATEDIFF(CURDATE(),'2015-03-22'),3);
+---+
| i |
+---+
| 2 |
| 5 |
| 8 |
+---+
SELECT * FROM ints WHERE MOD(i,3) = MOD(DATEDIFF(CURDATE(),'2015-03-23'),3);
+---+
| i |
+---+
| 1 |
| 4 |
| 7 |
+---+
Obviously, add 1 to the calculation if necessary.