请教一个高性能的算法取值

qq_27294663 2018-01-09 06:50:24

我有这样一张表.

aindex 是1-12
usertoken是用户标识
isright 是0-2
.
1.我现在要取出所有 isright =2的 aindex是1的有多少人 是2的有多少人 一直到 是12的有多少人
2.我要取出 所有isright=2的 aindex 从1-12都有的人 有哪些...
感谢
我是用C#
...全文
286 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_41611455 2018-01-09
  • 打赏
  • 举报
回复
这里也看到了 不是说了, 你这个 设计逻辑有问题, 你在提交的时候新建一个表把你要的存进去 然后直接 读. 否则你这样怎么读都是性能不高. 你想就好,12个一级条件 每个下面又有一个 是12的平方 次计算 ,性能要高才怪
qq_27294663 2018-01-09
  • 打赏
  • 举报
回复
引用 2 楼 yenange 的回复:
如果 aindex 全部的种类正好就是 12 种, 可以改成:
--2. 1到12的全都有的人有哪些
;WITH cte(aindex) AS(
	SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
	UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8
	UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12
)
SELECT * FROM tableName AS b WHERE b.isright=2
AND EXISTS(
	SELECT 1 FROM tableName AS b2 
	WHERE b2.id = b.id
	GROUP BY b2.aindex
	HAVING COUNT(b2.aindex)=12
) AS t
消息 156,级别 15,状态 1,第 13 行 关键字 'AS' 附近有语法错误。
qq_27294663 2018-01-09
  • 打赏
  • 举报
回复
引用 3 楼 greentea108 的回复:
SELECT * FROM ( SELECT ROW_NUMBER() OVER(PARTITION BY aindex),* FROM TABLE WHERE isight=2 ) AS t
消息 4112,级别 15,状态 1,第 2 行 排名函数 "ROW_NUMBER" 必须有 ORDER BY 子句。
qq_27294663 2018-01-09
  • 打赏
  • 举报
回复
版主谢谢你,,虽然没帮上忙 我打算 参考 6楼兄弟 存的时候直接 把要的存个表,感谢
吉普赛的歌 2018-01-09
  • 打赏
  • 举报
回复
如果 aindex 全部的种类正好就是 12 种, 可以改成:
--2. 1到12的全都有的人有哪些
;WITH cte(aindex) AS(
	SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
	UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8
	UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12
)
SELECT * FROM tableName AS b WHERE b.isright=2
AND EXISTS(
	SELECT 1 FROM tableName AS b2 
	WHERE b2.id = b.id
	GROUP BY b2.aindex
	HAVING COUNT(b2.aindex)=12
) AS t
greentea108 2018-01-09
  • 打赏
  • 举报
回复
SELECT * FROM ( SELECT ROW_NUMBER() OVER(PARTITION BY aindex),* FROM TABLE WHERE isight=2 ) AS t
吉普赛的歌 2018-01-09
  • 打赏
  • 举报
回复
--1. 1到12的人有哪些
;WITH cte(aindex) AS(
	SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
	UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8
	UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12
)
SELECT * FROM cte AS a LEFT JOIN tableName AS b ON a.aindex=b.aindex 
WHERE b.isright=2 

--2. 1到12的全都有的人有哪些
;WITH cte(aindex) AS(
	SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
	UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8
	UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12
)
SELECT * FROM tableName AS b WHERE b.isright=2
AND (
	SELECT COUNT(1) FROM (
		SELECT b2.aindex FROM tableName AS b2 
		WHERE b2.id = b.id
		GROUP BY b2.aindex
	) AS t
	INNER JOIN cte ON t.aindex=cte.aindex 
)=12

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧