我正在尝试基于200多个不同的值创建数据透视表。朋友已经准备好了我在T-SQL中需要的实例,但是ROW_NUMBER函数在MySQL中不可用,我无法将其翻译成我需要的东西。
UniqueTally值是在此之前出现了多少个Word的不同值的计数。下面的示例显示,当第3行再次出现“a”时,这不会增加UniqueTally,因为它也在第1行中。
我的数据如下:
表“Word”
| WordID | MemberID | Word | UniqueTally
| 1 | 1 | a | 1
| 2 | 1 | b | 2
| 3 | 1 | a | 2
| 4 | 2 | c | 1
| 5 | 2 | d | 2
| 6 | 2 | e | 3
我有200多个成员,我正在尝试创建一个表格,显示所有成员中唯一计数的增加情况。即按成员对齐UniqueTally值。 Word索引是此成员的行条目号
| WordIndex | UniqueTallyMember1 | UniqueTallyMember2 | etc
| 1 | 1 | 1
| 2 | 2 | 2
| 3 | 2 | 3
一位朋友在T-SQL中生成了我需要的代码:
/* Return the data */
SELECT
[WordSpoken]
,[182] AS [Mem182_UniqueTally]
,[200] AS [Mem200_UniqueTally]
FROM (
SELECT [WordSpoken], [MemberID], [UniqueTally]
FROM (
SELECT
ROW_NUMBER() OVER(PARTITION BY [MemberID] ORDER BY
[WordID]) AS [WordSpoken]
,[MemberID]
,[UniqueTally]
FROM [dbo].[ut_test]
) AS [test]
) AS [tbl]
PIVOT (MAX(UniqueTally) FOR MemberID IN ([182],[200])) AS [pvt]
GO
这仅使用2个MemberID值,但它的工作方式与对齐唯一值的工作量相同。 我在MySQL中需要类似的东西,它也会动态地接收MemberID。这可能吗?
我已经尝试使用谷歌搜索和搜索其他类似的帖子,但我无法将这些直接翻译成我的问题。
答案 0 :(得分:1)
模拟numericInput
的直接方法是使用ROW_NUMBER
有条件地增加会话变量。见这个例子:
ORDER BY
请注意,如果没有临时表,这可能是可能的,具体取决于您的本地设置:
#DROP TEMPORARY TABLE IF EXISTS sessionVarDemo;
CREATE TABLE sessionVarDemo(memberId INT UNSIGNED);
INSERT INTO sessionVarDemo VALUES (1), (2), (3), (2), (3), (1), (2), (2), (1), (1);
SET @VMemberID := 0, @VCounter := 0;
#Ensure data is correctly ordered
#DROP TEMPORARY TABLE IF EXISTS sessionVarDemoOrdered;
CREATE TEMPORARY TABLE sessionVarDemoOrdered SELECT memberId FROM sessionVarDemo ORDER BY memberId;
SELECT @VCounter := IF(@VMemberID != memberId, 0, @VCounter + 1) rowNumber, @VMemberID := memberId memberId FROM sessionVarDemoOrdered A;
此致
修改1
如果您运行此代码,是否使用1-3中的memberid获得以下输出并且rownumber正确递增?
SELECT @VCounter := IF(@VMemberID != memberId, 0, @VCounter + 1) rowNumber, @VMemberID := memberId memberId FROM sessionVarDemo ORDER BY memberId A;
修改2
以下是我如何使用会话变量在朋友伪代码中实现#DROP TEMPORARY TABLE IF EXISTS sessionVarDemo;
CREATE TABLE sessionVarDemo(memberId INT UNSIGNED);
INSERT INTO sessionVarDemo VALUES (1), (2), (3), (2), (3), (1), (2), (2), (1), (1);
SET @VMemberID := 0, @VCounter := 0;
SELECT @VCounter := IF(@VMemberID != memberId, 0, @VCounter + 1) rowNumber, @VMemberID := memberId memberId FROM sessionVarDemo ORDER BY memberId A;
+-----------+----------+
| rowNumber | memberId |
+-----------+----------+
| 0 | 1 |
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 1 |
| 7 | 1 |
| 0 | 2 |
| 1 | 2 |
| 2 | 2 |
| 3 | 2 |
| 4 | 2 |
| 5 | 2 |
| 6 | 2 |
| 7 | 2 |
| 0 | 3 |
| 1 | 3 |
| 2 | 3 |
| 3 | 3 |
+-----------+----------+
20 rows in set (0.00 sec)
:
ROW_NUMBER
詹姆斯